2013-05-17 15 views
5

Ich benutze C++, um ein Schachspiel zu programmieren. Ich möchte zwei Klassenattribute für das Klassenboard erstellen: ROWS und COLUMNS. In Java würde ich sie als statisches Finale deklarieren und alles würde so funktionieren, wie ich es möchte. Wie mache ich die gleiche Deklaration in C++? Ich muss auf diese Attribute von "Board :: ROWS" und "Board :: COLUMNS" in anderen Klassen zugreifen.C++ Java statisches endgültiges Äquivalent

Was ich habe, ist dies, die Kompilierungsfehler wirft, da ROWS und Spalten nicht im Rahmen der Deklaration von m_TileMap deklariert sind. Gibt es eine gute Übung, dies zu tun, ohne #define Aussage zu verwenden?

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

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

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

Ich empfehle stattdessen std :: vector statt! –

Antwort

2

erklären Ihre m_TileMap nach der Erklärung von Zeilen und Spalten

z.B

class Board { 

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

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

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

Der Grund dafür ist, weil der Compiler in C++ nicht vorwärts liest. Damit ROWS und COLUMNS vom Compiler beim Deklarieren von m_TileMap verstanden werden, müssen sie zuvor deklariert werden.

+0

Vielen Dank für die Erklärung, es macht Sinn. –

1

können Sie erneut, um die Klassenmitglieder, so dass Zeilen und Spalten deklariert werden, bevor sie verwendet werden:

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

Danke! Das hat funktioniert ... –

+0

@LucasKreutz - Gern geschehen. Und willkommen bei StackOverflow. Sie können die Antworten, die Sie nützlich finden, aufwerten, indem Sie auf das obere Dreieck auf der linken Seite klicken. (Dies ist zusätzlich verfügbar, um die Antwort zu markieren, die für Sie am nützlichsten ist.) –

0

Sie müssen die Größen in der Klassendefinition angeben: static const int ROWS = 8; usw.

Und vergessen Sie nicht die; nach der Klassendefinition!

1

Try Verwendung Aufzählungen wie folgt

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

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

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

ROWS und COLUMNS noch nicht erklärt worden, wenn die Definition für m_TileMap analysiert wird. Bewegen Sie einfach diese Definitionen:

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

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

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

Als Nebenwirkung, wenn Sie jemals die Adresse ROWS oder COLUMNS nicht nehmen müssen, wäre eine Alternative ein enum zu verwenden, wie folgt aus:

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


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

All dies wurde gesagt, wäre das Leben nicht so viel einfacher, wenn Sie nur vector verwendet?

+0

Danke für die Erklärung. Ich werde ein Enum verwenden, ich denke, es ist ziemlich besser. Ich habe ein Array verwendet, weil ich denke, dass es einfacher ist, mit einem Minimax-Algorithmus zu arbeiten. –

Verwandte Themen