2013-05-17 8 views
5

Sto usando C++ per programmare un gioco di scacchi. Voglio creare due attributi di classe per la classe Board: ROWS e COLUMNS. In Java, li dichiarerei come finali statici e tutto funzionerebbe come voglio. Come faccio la stessa dichiarazione in C++? Ho bisogno di accedere a questi attributi per "Board :: ROWS" e "Board :: COLUMNS" in altre classi.Equivalente finale statico C++ Java

Quello che ho è questo, che genera errori di compilazione poiché ROWS e COLUMNS non sono dichiarati nell'ambito della dichiarazione di m_TileMap. Esiste una buona pratica per fare ciò senza usare la dichiarazione #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

Suggerisco di usare std :: vector invece! –

risposta

2

dichiarare il vostro m_TileMap dopo la dichiarazione di righe e colonne

per esempio

class Board { 

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

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

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

La ragione di ciò è perché in C++, il compilatore non legge in avanti. Quindi per il ROWS e il COLUMNS devono essere compresi dal compilatore quando si dichiara m_TileMap, devono essere dichiarati prima.

+0

Grazie per la spiegazione, ha senso. –

1

È possibile riordinare i membri della classe, in modo che le righe e le colonne sono dichiarate prima di essere utilizzati:

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

Grazie! Ha funzionato ... –

+0

@LucasKreutz - Prego. E benvenuto su StackOverflow. Puoi sviare le risposte che ritieni utili facendo clic sul triangolo verso l'alto alla loro sinistra. (Questo è disponibile in aggiunta al segno di spunta la risposta più utile per te.) –

0

È necessario specificare le dimensioni nella definizione della classe: static const int ROWS = 8; ecc.

E non dimenticare il; dopo la definizione della classe!

1

uso Prova enumerazioni come seguendo

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

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

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

ROWS e COLUMNS non sono ancora stati dichiarati quando la definizione per m_TileMap viene analizzato. Basta spostare queste definizioni:

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

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

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

Per inciso, se non avete bisogno di prendere sempre l'indirizzo del ROWS o COLUMNS, un'alternativa sarebbe quella di utilizzare un enum, in questo modo:

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


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

Tutto ciò detto, la vita non sarebbe tanto più semplice se si usasse lo vector?

+0

Grazie per la spiegazione. Userò un enum, penso che sia molto meglio. Ho usato un array perché penso che sarà più facile da usare con un algoritmo minimax. –