[SFML 2.0] Problem z układem klas w kodzie źródłowym [rozwiązano]
Ostatnio zmodyfikowano 2013-01-22 20:15
kubawal Temat założony przez niniejszego użytkownika |
[SFML 2.0] Problem z układem klas w kodzie źródłowym [rozwiązano] » 2013-01-19 14:09:46 Witam! Piszę grę typu labirynt. Mam pewien problem z układem klas. Nie ważne, w jakiej je ułożę kolejności, zawsze wywala mnóstwo błędów typu "undeclared indentifier": Oto układ klas: class Game; class Object
{ };
class Tile; class Map { };
class Player : public Object { };
class Tile : public Object { };
class Air : public Tile { };
class Crack : public Tile { };
class Game { };
Przy takim układzie wywala takie błędy (pominę ostrzeżenia): 1>------ Build started: Project: Labirynt, Configuration: Debug Win32 ------ 1> main.cpp 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2027: use of undefined type 'Tile' 1> c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(53) : see declaration of 'Tile' 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2065: 'weight' : undeclared identifier 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2027: use of undefined type 'Tile' 1> c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(53) : see declaration of 'Tile' 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2065: 'height' : undeclared identifier 1> classes.cpp 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2027: use of undefined type 'Tile' 1> c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(53) : see declaration of 'Tile' 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2065: 'weight' : undeclared identifier 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2027: use of undefined type 'Tile' 1> c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(53) : see declaration of 'Tile' 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(66): error C2065: 'height' : undeclared identifier 1>c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.cpp(15): error C2572: 'Player::Player' : redefinition of default parameter : parameter 3 1> c:\documents and settings\kubuś\moje dokumenty\visual studio 2010\projects\labirynt\classes.h(85) : see declaration of 'Player::Player' 1> Generating Code... ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Próbowałem różnych kombinacji, nic nie działało. Kod klas mam w classes.h i classes.cpp, reszta w main.cpp. Z góry dziękuje za pomoc. |
|
DanielSC |
» 2013-01-19 15:13:03 A deklaracja klasy nie powinna wygladac tak ? : a nie tak : class Player : public Object { }; |
|
ridic14 |
» 2013-01-19 16:52:19 Może wyglądać tak : class B { public: virtual void update() = 0; };
class A : public B { public: void update(); }; bo to chyba dziedziczenie nie? |
|
RazzorFlame |
» 2013-01-20 10:58:24 Podaj kod klas bo z loga wynika że źle masz w nich :P |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2013-01-21 10:19:01 Do DanielSC i ridic14: Tak, to jest model obiektowy. Klasy definiuje się tak: class Klasa : public KlasaBazowa { public: private: };
Odsyłam do powstającego w dziale "Nowe publikacje" kursu obiektowości. Do RazzorFlame: Z loga wynika, że dane klasy Tile (kafelka) nie są dla mnie dostępne przed jej definicją. Za pomocą deklaracji klasy można chyba odwoływać się do jej obiektów, ale nie do metod i danych statycznych. Przedstawię linie klas, przy których wywala błąd: class Tile; class Map { public: struct Position { int x, y; Vector2f GetScreenCoord() const { return Vector2f( x * Tile::weight, y * Tile::height ); } }; };
class Tile : public Object { public: static const int height = 40; static const int weight = 40; };
|
|
akwes |
» 2013-01-21 16:36:12 No przecież w momencie, kiedy używasz klasy Tile, masz ją jedynie zdeklarowaną a nie zdefiniowaną... Kompilator w momencie użycia "Tile::Width" wie tylko tyle, że gdzieś być może będzie definicja klasy Tile, ale aktualnie zgodnie z wiedzą kompilatora, w Tile tego nie ma. Oddziel implementacje metod i zmiennych statycznych od definicji klas, najlepiej na pliki, ostatecznie można też w jednym. class Abc { void Foo(); };
void Abc::Foo() { }
@DanielSC i ridic14: Jeżeli nie rozumiecie tematu, to się nie wypowiadajcie. Wasze przytoczone "deklaracje" to już "definicje". |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2013-01-22 20:15:01 Tak, dzięki akwes. Działa. Temat rozwiązany. |
|
« 1 » |