2013-05-17 23 views
5

Używam C++ do programowania gry w szachy. Chcę utworzyć dwa atrybuty klasy dla tablicy klas: ROWS i COLUMNS. W Javie ogłosiłbym, że są statyczne i wszystko będzie działać tak, jak chcę. Jak zrobić to samo oświadczenie w C++? Muszę uzyskać dostęp do tych atrybutów przez "Board :: ROWS" i "Board :: COLUMNS" w innych klasach.C++ Java statyczny odpowiednik końcowy

To, co mam, to jest to, co rzuca błędy kompilacji, ponieważ ROWS i COLUMNS nie są zadeklarowane w zakresie deklaracji m_TileMap. Czy istnieje dobra praktyka, aby to zrobić bez użycia instrukcji #define?

class Board { 
    Tile *m_TileMap[ROWS][COLUMNS]; 

public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 
} 
+0

Proponuję zamiast tego używać std :: vector ! –

Odpowiedz

2

zadeklarować swój m_TileMap po deklaracji wierszy i kolumn

na przykład

class Board { 

public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 

private: 
    Tile *m_TileMap[ROWS][COLUMNS]; 
}; 

Powodem tego jest fakt, że w C++ kompilator nie czyta do przodu. Aby więc kompilator mógł zrozumieć ROWS i COLUMNS po zadeklarowaniu m_TileMap, muszą one zostać zadeklarowane wcześniej.

+0

Dziękuję za wyjaśnienie, ma to sens. –

1

Można zmienić kolejność członków klasy, tak aby wiersze i kolumny są zadeklarowane, zanim zostaną wykorzystane:

class Board { 
public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 

private: 
    Tile *m_TileMap[ROWS][COLUMNS]; 
}; 
+0

Dziękujemy! To zadziałało ... –

+0

@LucasKreutz - Nie ma za co. Witamy w StackOverflow. Możesz udzielić odpowiedzi, które uznasz za przydatne, klikając trójkąt w górę po lewej stronie. (Jest to dostępne oprócz zaznaczenia wyboru najbardziej przydatnej odpowiedzi). –

0

Musisz podać rozmiary w definicji klasy: statyczna const int ROWS = 8; itp.

I nie zapomnij; po definicji klasy!

1

użytku Spróbuj teksty stałe w następujący sposób

class Board { 
public: 
    enum {ROWS = 8}; 
    enum {COLUMNS = 8}; 

private: 
    Tile *m_TileMap[ROWS][COLUMNS]; 

public: 
    Board(int m[ROWS][COLUMNS]); 
}; 
1

ROWS i COLUMNS nie został jeszcze ogłoszony, gdy definicja m_TileMap jest analizowany. Wystarczy przesunąć te definicje:

class Board { 
    Tile *m_TileMap[ROWS][COLUMNS]; 

public: 
    static const int ROWS = 8; 
    static const int COLUMNS = 8; 

    Board(int m[ROWS][COLUMNS]); 
}; 

Tak na marginesie, jeśli nie trzeba zawsze brać adres ROWS lub COLUMNS, alternatywą byłoby użyć enum, tak:

class Board { 
public: 
    enum { ROWS = 8, COLUMNS = 8}; 
    Tile *m_TileMap[ROWS][COLUMNS]; 


    Board(int m[ROWS][COLUMNS]); 
}; 

Wszystko to zostało powiedziane, czy życie nie byłoby tak proste, gdybyś po prostu użył vector?

+0

Dziękuję za wyjaśnienie. Użyję enum, myślę, że jest całkiem nieźle. Użyłem tablicy, ponieważ myślę, że będzie łatwiej używać z algorytmem minimax. –