无效使用非静态数据成员'Board :: N'

时间:2016-07-21 02:27:02

标签: c++ eclipse c++11

这是标题:

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 scopeLike this

哪里错了?我找不到了。

2 个答案:

答案 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成员变量来实现上述实例。