这是我的Game类的构造函数:
// 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);
这是如何工作的?是否被复制?
如果我想保存指向播放器的指针,我应该创建如下的私有ivar吗?
private:
Player* _player;
...
// In Game constructor
_player = player;
答案 0 :(得分: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
}
对于指针,没有太大的区别,但是对于更复杂的对象,使用初始化可以避免分配时可能出现的语义和性能问题。
答案 1 :(得分: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)
{
...
}
答案 2 :(得分:2)
你正在通过reference传递棋盘,所以不,它没有被复制。
如果您稍后有一些代码:
Board _privateBoard = b;
然后您正在复制 b 。但它没有被复制到函数中。
关于你的问题,是的,你需要将指针存放在某个地方,如果你想把它拿回去。