2015-04-16 8 views
2

У меня есть два класса: класс платы и класс игрока. Брейк должен делиться между игроками. Я получаю ошибку в файле cpp игрока, говоря «Player :: board»: must инициализируется в конструкторе базового/члена списка инициализации»Совместное использование объекта с другим классом C++

Вот мой проигрыватель файлов заголовок:

class Player { 
private: 
    Board &board; 
    string name; // I put a reference 
}; 

в игрока CPP файл:

// I pass the board in the board class by refrence but get the above error 
Player::Player(string n,Board&b) { 
    name=n; 
    board=b; 
} 

Между тем мой совет класс выглядит следующим образом:

class Board { 
private: 
    int** board; 
    int row; 
    int column; 
}; 

Board::Board(int r,int c) { 
    row=r; 
    column=c; 
    board=new value*[r]; 

    for(int i=0;i<r;i++) { 
     board[i] = new value[c]; 
    } 
} 

ответ

3

Вы не можете отложить инициализацию ссылку. Как ошибка говорит вам, что вам нужно инициализировать его в списке инициализации членов, например:

Player::Player(string n,Board&b) : board(b) // preferably also ,name(n) 
{ 
    // rest of implementation 
} 

Предпочтительно, вы также должны инициализировать name в списке инициализации членов, и передать string n по const ссылки, как const string& n, поэтому вы избегаете дополнительной копии. Если вы используете g++, вы можете использовать флаг компилятора -Weffc++, который даст вам предупреждения об инициализации списка членов и т. Д.

1

Старайтесь избегать использования ссылок в качестве элементов данных класса. Некоторые общие проблемы:

  • Вы должны инициализировать ссылку в каждом конструкторе списке initilization,
  • Семантика может сбивать с толку,
  • Ссылки идеально подходят для передачи параметров методов,
  • Ссылки не позволяют назначение

Вместо этого попробуйте использовать указатели в качестве элементов данных, что позволит избежать проблем, и ваш код будет более читабельным.

EDIT: Если вам нужен один объект Board, который будет использоваться для всех игроков, вы можете использовать Singleton.

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