2016-07-21 56 views
-1

这是标题:无效使用非静态数据成员的“公告板:: 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'); 
     } 
    } 
} 

在游戏类的成员函数void BuildGame,我想打电话给成员函数Board& SetType(int,int,char)类Board.I定义此函数在头文件中,而不是在这里显示。然后我建立这个项目,我得到了invalid use of non-static data member 'Board::N''SetType' was not declared in this scopeLike this

我哪里错了?我找不到它。

+0

@ildjarn我严重怀疑这会解决问题。 –

回答

1

编译器让你知道你正在使用一个实例变量作为静态变量。一个静态变量与整个类而不是单个对象相关联,所以它通过类名而不是类的对象来调用。但它需要被标记为静态的,像这样

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

我本能但是告诉我,你想在一个实例级别使用它,所以你会使用写void Game::buildGame()方法Board它创建(可能使它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的方法来修改实例并返回,而不是返回另外主板参考无效

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类来重用Board结构。

0

N不是类Board的静态成员,因此您需要一个板的实例来访问它。


Game类实际上需要有一个Board成员变量来实现,上述实例。

+0

谢谢。你们两个帮我解决了这个问题。 –

相关问题