这是标题:
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');
}
}
}
在类Game的成员函数void BuildGame
中,我想在类Board中调用成员函数Board& SetType(int,int,char)
。我在头文件中定义此函数,而不是在此处显示。然后我构建了项目,得到了invalid use of non-static data member 'Board::N'
和'SetType' was not declared in this scope
。 Like this
哪里错了?我找不到了。
答案 0 :(得分:1)
编译器告诉您正在使用实例变量作为静态变量。静态变量与整个类相关联,而不是与单个对象相关联,因此它通过类名而不是类的对象来调用。但它需要被标记为静态,如此
class Board
{
public:
static Board& setType(int, int, char);
...
private:
static int N;
...
}
然而,我的直觉告诉我你想在实例级别使用它,所以你要使用它创建的void Game::buildGame()
来编写Board
方法(可能使它成为{Game
的属性1}} class:
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
结构的Board
类。
答案 1 :(得分:0)
N
不是类Board
的静态成员,因此您需要一个董事会实例来访问它。
您的Game
类实际上需要一个Board
成员变量来实现上述实例。