2009-05-16 4 views
3

Вот конструктор для моего класса Game:C++ Передача копии объекта или передача указателя на объект?

// Construct a Game to be played with player on a copy of the board b. 
Game(const Board& b, Player* player) 
{ 
    ... 
} 

Вот как я с помощью конструктора:

Player p("Player Name"); 
Board b(6,3); 
Game g(b, &p); 

Как это работает? Скопировано ли b?

Если я хочу сохранить указатель на игрока, должен ли я создать частный ivar, как показано ниже?

private: 
    Player* _player; 

... 
// In Game constructor 
_player = player; 
+0

В качестве примечания: не префикса переменных с «_» в C++, так как префикс «_» зарезервирован для поставщика компилятора в C & C++. –

+1

Какое имя я должен использовать? – Elliot

+0

Я хочу прокомментировать, что это может быть опасно (поэтому вектор на самом деле делает копию объекта и принимает ссылку при вызове push_back) - пример https://gist.github.com/nadams810/6756139. Этот код отлично работает на VC++/gcc ...но это просто случайная удача, поскольку деструктор был вызван для CC, поэтому x больше не должен использоваться. Я не говорю, что вам следует или не следует использовать его - просто помните о масштабах того, что вы проходите. –

ответ

6

Если вы передадите ссылку или указатель, копия не будет сделана. Если вы хотите сохранить указатель, то да, вам нужно где-то его сохранить.

Обратите внимание, что лучше использовать списки инициализации конструктора вместо назначения. предпочитают:

Game(const Board& b, Player * player) : _player(player) 
{ 
    // do something with Board 
} 

к:

Game(const Board& b, Player * player) 
{ 
    _player = player; 
    // do something with Board 
} 

Для указателей, нет большой разницы, но для более сложных объектов, с помощью инициализации позволяет избежать возможных семантических проблем с производительностью и с заданием.

+0

При назначении константным членам список инициализации является * единственным * способом. – Dario

2

Вы передаете доску reference, так что нет, она не копируется.

Если у вас есть код позже, как:

Board _privateBoard = b; 

Затем вы копируете б. Но он не копируется в функцию.

Что касается вашего вопроса, да, вам нужно будет сохранить указатель где-нибудь, если вы хотите его вернуть.

+0

«Тогда вы копируете b», если _privateBoard - это «Совет», а не «Совет &», нет? –

+0

Yup. Я отредактировал, чтобы уточнить. – GManNickG

5

Как уже упоминалось, параметр не будет скопирован по мере его прохождения по ссылке.
Но я хотел бы указать на некоторые проблемы стиля.

Не смешивайте свой стиль. Можно ли играть в игру без игрока? Если это не так, передайте плеер по ссылке.

Другое соединение. Один параметр вы передаете как целое слово, так и другое как одно письмо.

Game(const Board& board, Player& player): 
    _player(player)  
{ 
    ... 
} 

private: 
    Player& _player; 

Возможно, вам захочется также сохранить Совет, поскольку это имеет смысл. Игра может «знать» о доске.

private: 
    const Board& _board; 

Тогда ваш конструктор будет

Game(const Board& board, Player& player): 
    _board(board), 
    _player(player) 
{ 
    ... 
} 
+0

+1 для указания, что для избежания копирования не требуется указатель - ссылки также могут использоваться. – 2009-05-16 09:05:40

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