2016-07-21 3 views
-1

Это заголовок:неправильного использование нестатического элемента данных «Board :: 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 scope. Like 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

Спасибо. Вы поможете мне решить эту проблему. –

Смежные вопросы