2016-07-21 9 views
-1

これはヘッダである:クラスゲームのメンバ関数void BuildGame無効な使用「ボード:: 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'); 
     } 
    } 
} 

、私はこれを定義したクラスBoard.Iにメンバ関数Board& SetType(int,int,char)を呼びたいですヘッダーファイル内の関数であり、ここには表示されません。それから私はプロジェクトを構築する、私はinvalid use of non-static data member 'Board::N''SetType' was not declared in this scopeを得た。 Like this

どこが間違っていますか?私はそれを見つけることができません。

+0

@ildjarn私はこの問題を解決することを真剣に考えています。 –

答えて

1

コンパイラはインスタンス変数を静的変数として使用していることを通知します。静的変数は、単一のオブジェクトではなくクラス全体に関連付けられているため、クラスの名前で呼び出され、クラスのオブジェクトでは呼び出されません。それはそう

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

おそらく作る(それが作成されますことを、私の本能が、しかし、あなたは、インスタンスレベルでそれを使用したいと言われますので、あなたはBoardを使用してvoid Game::buildGame()方法を記述しますのような静的なとしてマークされる必要があるであろうそれGameクラスの属性:。

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'); 
     } 
    } 
} 

そして、このようになりますBoardクラスは、あなたはおそらく、あなたのsetTypeメソッドがインスタンスを変更し、代わりに別のボードの参照を返すvoidを返すことになるでしょう

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; 
     ... 
} 

あなたはそれでいる間、ゲームのための「隠れた」ホルダークラスのようだとして、あなたはそれ(デフォルトではパブリックメンバーを持っている)structなるかもしれないが、これは使用する必要性を軽減するだろうfriend class(これらは厄介なものが本当に速くなるので賢明に使用されます)。 structを使用すると、構造体を再利用するChessGameクラスを作成することもできます。

0

Nは、クラスBoardの静的メンバーではないため、アクセスするにはボードのインスタンスが必要です。


あなたGameクラスは、実際に上記のインスタンスを言及したことを達成するためにBoardメンバ変数を持っている必要があります。

+0

ありがとうございます。私はこの問題を解決するのに役立ちます。 –

関連する問題