Rzutowanie klas

0

Witajcie. Oto problem:
Mam klasę EngineInit:

class EngineInit

W innym pliku mam klasę Surface, która dziedziczy klasę EngineInit:

class Surface : public EngineInit 

Teraz w programie mam "kolizję" tych klas bo:

 
EngineInit *nInit = new EngineInit(800,600,SDL_SWSURFACE);
Surface *pics = new Surface(); // to jest błąd.
// potrzebuje klasy Surface wiec staram się skombinować cos takiego:
Surface *pics = new EngineInit(800,600,SDL_SWSURFACE); // ale to nie przechodzi ; \ 
więc poczytałem o rzutowaniu :
Surface *pics = new dynamic_cast<Surface*>(EngineInit(800,600,SDL_SWSURFACE)); 
// lecz to nadal nie dziala, wywala mi error. Jesli zrobie hierarchicznie tak :
EngineInit *nInit = new Surface(); // dziala.

Teraz moje pytanie.. jak zrzutować abym mógł to stworzyć przez Surface ?

// proszę o połączenie postów :

Czy takie coś jest prawidłowe ? :

EngineInit *nInit = new EngineInit(800,600,SDL_SWSURFACE);
Surface *pics = static_cast<Surface*>(nInit);
 
0

Nie, bo nInit nie jest typu Surface (EngineInit nie dziedziczy po Surface - jest odwrotnie).

Dlaczego zwykłe:

Surface *pics = new Surface();

to błąd?

Może pokaż definicje Surface i EngineInit.

0

Wywala mi błędy :

init.h(8): error C2011: 'EngineInit' : 'class' type redefinition, init.h(8) : see declaration of 'EngineInit'
surfaces.h(11): error C2504: 'EngineInit' : base class undefined
main.cpp(8): error C2027: use of undefined type 'EngineInit
init.h(8) : see declaration of 'EngineInit'

Init.h:

#include <iostream>
#include <SDL.h>
using namespace std;



class EngineInit
{
private:
	int WindowSizeX, WindowSizeY;
	Uint32 mode;
public:
	SDL_Surface *InitSurface;
	EngineInit();
	EngineInit(int WindowWeight, int WindowHeigh, Uint32 Mode);
	~EngineInit();
};

 

Surfaces.h:

#include "Init.h"


enum DIRECTIONS
{
	LEFT, RIGHT, UP, DOWN
};


class Surface : public EngineInit
{
private:
	SDL_Rect Rectangle;
	SDL_Surface *robocze;
public:
	Surface();
	void rotate(double radius);
	void changeDirection(DIRECTIONS way);
	SDL_Surface *loadBMP(string filename);
	~Surface();
}; 

Muszę mieć dostęp do klasy Surface ale muszę również mieć dostęp do EngineInit. Jak usuwam dziedziczenie z klasy Surface, wszystko działa, tylko wtedy w klasie Surface nie mam dostępu do *SDL_Surface InitSurface a to jakby główny surface mojego programu

1

A napisz kolego, czy w main.h również robisz #indlude "Init.h"? Jakoś nie zauważyłem, żebyś w jakikolwiek sposób zabezpieczał się przed podwójnym include'm plików nagłówkowych, więc pewnie problem leży tutaj.

0

Utwórz konstruktor Surface(int WindowWeight, int WindowHeigh, Uint32 Mode) w klasie Surface rzecz jasna i niech wywołuje konstruktor klasy bazowej z listy inicjalizacyjnej. Będziesz mógł utworzyć od razu obiekt Surface. Obiekt klasy potomnej posiada wszystkie nieprywatne składniki klasy bazowej + nowe rzeczy. Wykorzystaj to.

0
stfu napisał(a)

A napisz kolego, czy w main.h również robisz #indlude "Init.h"? Jakoś nie zauważyłem, żebyś w jakikolwiek sposób zabezpieczał się przed podwójnym include'm plików nagłówkowych, więc pewnie problem leży tutaj.

łahła dzięki nie zauważyłem że podwójnie jakby inkludowałem ten sam nagłówek. Działa;d

0

Mam następny problem a żal robić nowy wątek bo dotyczy to tego.
W klasie EngineInit mam 2 konstruktory:

  1. EngineInit();
  2. EngineInit(int WindowWeight, int WindowHeigh, Uint32 Mode);
    W klasie Surface mam 1 konstruktor:
  3. Surface();
EngineInit::EngineInit(int WindowWeight, int WindowHeigh, Uint32 Mode)
{
	WindowSizeX = WindowWeight; WindowSizeY = WindowHeigh;
	mode = Mode;
	SDL_Init(SDL_INIT_EVERYTHING);
	InitSurface = SDL_SetVideoMode(WindowSizeX, WindowSizeY, 32, mode);
	if(!InitSurface)
	{
		cout << "ENGINE::EngineInit() [ERROR]\n";
		cout << "Blad z inicjalizacja ekranu\n";
	}
	else
		cout << "ENGINE::EngineInit() [DONE]\n";
}
////////////////////////////////////////////////
EngineInit::EngineInit()
{
	WindowSizeX = 800; WindowSizeY = 600; mode = SDL_SWSURFACE;
	SDL_Init(SDL_INIT_EVERYTHING);
	InitSurface = SDL_SetVideoMode(WindowSizeX, WindowSizeY, 32, mode);
	if(!InitSurface)
	{
		cout << "ENGINE::EngineInit() [ERROR]\n";
		cout << "Blad z inicjalizacja ekranu\n";
	}
	else
		cout << "ENGINE::EngineInit() [DONE]\n";
}
///////////////////////////////////////
Surface::Surface()
{
	Rectangle.x = 0; Rectangle.y = 0;
	Rectangle.h = 0; Rectangle.w = 0;
	workSurface = NULL;
	cout << "ENGINE::Surface() [DONE]\n";
}
 

W main robie tak:

 
EngineInit *nInit = new EngineInit;
Surface *pictures = new Surface;

Dlaczego w tym przypadku uruchamia mi się 2 razy konstruktor EngineInit ??
Konsola wypluwa tak:
ENGINE::EngineInit() [DONE]
ENGINE::EngineInit() [DONE]
ENGINE::Surface() [DONE]

Skoro tylko raz tworzę obiekt klasy EngineInit... Powinno być:
ENGINE::EngineInit() [DONE]
ENGINE::Surface() [DONE]

0

Pogóglaj,cóż to takiego jest "strażnik nagłówka" i po co się to stosuje.

0
qwe napisał(a)

Dlaczego w tym przypadku uruchamia mi się 2 razy konstruktor EngineInit ??
Konsola wypluwa tak:
ENGINE::EngineInit() [DONE]
ENGINE::EngineInit() [DONE]
ENGINE::Surface() [DONE]

Bo klasa Surface dziedziczy po EngineInit, więc pola z klasy bazowej, które zostały odziedziczone przez klasę potomną muszą zostać jakoś zainicjalizowane. Dzieje się tak właśnie w konstruktorze klasy bazowej, bo gdzie niby indziej? :)

0

Ja dodam jedno drobne pytanie. Po jakę cholerę dziedziczysz Surface po EngineInit? Czy surface powinno inicjować silnik -- najprawdopodobniej nie. Poczytaj o podstawach programowania obiektowego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1