Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Problem z układem klas w kodzie źródłowym [rozwiązano]

Ostatnio zmodyfikowano 2013-01-22 20:15
Autor Wiadomość
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:
C/C++
class Game;
class Object
// reprezentuje wszystkie obiekty, które można narysować
{
    //...
};

class Tile; // kafelek
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.
P-74393
DanielSC
» 2013-01-19 15:13:03
A deklaracja klasy nie powinna wygladac tak ? :
C/C++
class Player
{
public:
    //...
};

a nie tak :

C/C++
class Player
    : public Object
{
    //...
};
P-74399
ridic14
» 2013-01-19 16:52:19
Może wyglądać tak :
C/C++
class B
{
public:
    virtual void update() = 0;
};

class A
    : public B
{
public:
    void update();
};
 bo to chyba dziedziczenie nie?
P-74411
RazzorFlame
» 2013-01-20 10:58:24
Podaj kod klas bo z loga wynika że źle masz w nich :P
P-74448
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:
C/C++
class Klasa
    : public KlasaBazowa
{
public:
    // Dane publiczne
private:
    // Dane prywatne
};
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:
C/C++
class Tile; // deklaracja
class Map
{
    //...
public:
    struct Position
    //pozycja kafelka
    {
        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;
};


P-74559
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.

C/C++
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".
P-74591
kubawal
Temat założony przez niniejszego użytkownika
» 2013-01-22 20:15:01
Tak, dzięki akwes.
Działa.
Temat rozwiązany.
P-74707
« 1 »
  Strona 1 z 1