2016-07-21 2 views
-1

Dies ist der Header:ungültige Verwendung von nicht-statischem Datenelement ‚Forum :: N‘

class Board { 
public: 
    friend class Game; 

    Board() = default; 
    Board(int n) : N(n) { } 

    Board& SetType(int, int, char); 
    void GetType(int, int); 
    Board& CreateEmptyBoard(); 
    void BoardDisplay(); 

private: 
    int N = 0;// dimension 
    char Maze[15][15]; 

    const static int MaxSize = 15; 
}; 

class Game { 
public: 
    Game() = default; 
    Game(int x, int y) : PosX(x), PosY(y) { } 

    void BuildGame(); 
    void GameDisplay(); 
    void MoveUp(); 
    void MoveDown(); 
    void MoveLeft(); 
    void MoveRight(); 

private: 
    int PosX = 0; 
    int PosY = 0; 
}; 

void Game::BuildGame() { 
    srand(time(NULL)); 
    for (int i = 0; i < Board::N; i++) { 
     for (int j = 0; j < Board::N; j++) { 
      if (i == rand() % (Board::N) && j == rand() % (Board::N)) 
       Board::Board& SetType(i, j, 'W'); 
     } 
    } 
} 

In Klasse Game Memberfunktion void BuildGame, ich will Memberfunktion Board& SetType(int,int,char) in Klasse Board.I nennen dies definieren Funktion in einer Header-Datei und nicht hier anzeigen. Dann baue ich das Projekt, ich habe invalid use of non-static data member 'Board::N' und 'SetType' was not declared in this scope. Like this

Wo ich falsch liege? Ich kann es nicht finden.

+0

@ildjarn Ich bezweifle ernsthaft, dass dies das Problem lösen würde. –

Antwort

1

Der Compiler teilt Ihnen mit, dass Sie eine Instanzvariable als statische Variable verwenden. Eine statische Variable ist einer ganzen Klasse und nicht einem einzelnen Objekt zugeordnet. Daher wird sie über den Klassennamen und nicht über ein Objekt der Klasse aufgerufen. aber es müsste als statisch markiert werden, wie so

class Board 
{ 
    public: 
     static Board& setType(int, int, char); 
     ... 
    private: 
     static int N; 
     ... 
} 

mein Instinkt aber sagt mir, dass Sie es auf Instanzebene verwenden möchten, so können Sie Ihre void Game::buildGame() Methode unter Verwendung eines Board schreiben würde, dass es schafft (möglicherweise machen es ein Attribut der Game Klasse.

void Game::BuildGame() { 
    //make your board here. alternatively make an instance of the game 
    Board myBoard(); 
    srand(time(NULL)); 
    //in the following, use myBoard as the instance of a board. 
    for (int i = 0; i < myBoard.N; i++) { 
     for (int j = 0; j < myBoard.N; j++) { 
      if (i == rand() % (myBoard.N) && j == rand() % (Board::N)) 
       myBoard.setType(i, j, 'W'); 
     } 
    } 
} 

und eine Board Klasse, die etwa wie folgt aussehen Sie werden wahrscheinlich wollen Ihre setType Methode, um die Instanz zu modifizieren und void zurückgeben stattdessen einen anderen Board Bezug der Rückkehr

.
class Board 
{ 
    public: 
     //this one will change this particular Board instance. 
     void setType(int, int, char); 
     //this one may make sense to be static if it is a factory method 
     //but why not use a constructor instead? 
     static Board& createEmptyBoard(); 
     //maybe you meant something to reset the board to empty state. 
     void resetBoardToEmpty(); 
     ... 
    private: 
     int N; 
     ... 
} 

während Sie gerade dabei sind könnten Sie machen es zu einem struct (die Mitglieder standardmäßig öffentlich ist), da es eine „versteckte“ Halter-Klasse für das Spiel zu sein scheint, und dies würde die Notwendigkeit lindern ein verwenden friend class (diese sind sinnvoll zu verwenden, da sie sehr schnell unordentlich werden können). Mit einem struct können Sie auch eine ChessGame Klasse erstellen, die die Struktur Board wiederverwendet.

0

N ist kein statisches Mitglied der Klasse Board, daher benötigen Sie eine Instanz der Karte, um darauf zuzugreifen.


Ihre Game Klasse braucht eigentlich eine Board Membervariable zu haben, zu erreichen, dass obiges Beispiel erwähnt.

+0

Danke. Sie zwei helfen mir, dieses Problem zu lösen. –

Verwandte Themen