【发布时间】:2020-10-15 00:30:15
【问题描述】:
我想为我的班级写一个副本 c'tor,其中包含这样的共享 ptr 列表:
std::vector<std::shared_ptr<Character>> board;
如果我希望他复制构造函数复制所有 Characters,那么在我的复制 c'tor 中编写以下内容就足够了:
Game::Game(const Game &other): dimensions(other.dimensions), board(dimensions.getRow()*dimensions.getCol()) {
int board_size= dimensions.getRow()*dimensions.getCol();
for (int i=0;i<board_size;++i)
{
this->board[i]=other.board[I]; //or *(this.board[I]=*other.board[I];
}
}
另外,我应该在 Character 类中编写 copy c'tor 吗? 请注意,我有 2 个问题,
【问题讨论】:
-
智能指针的全部意义在于避免不必要和危险的东西,包括复制构造函数。如果你确实想要一份副本,为什么要拿着指针。
-
根据您的成员变量,您可能不需要显式的复制构造函数。 0/3/5 规则以“0 规则”开头。如果您不需要编写复制 c'tor、operator= 或析构函数,则不要。
-
如果这些是您唯一的成员并且共享
Characters 是您想要的,那么您不需要复制构造函数。如果你想复制Characters,你可以这样做。 -
从另一个方向接近这个:你真的想复制
Game吗?我之所以问,是因为没有保留游戏状态的备份(在这种情况下,Characters 的共享所有权不是一个好主意)我没有看到需要。您可能想要充实需要复制Game的用例,并确保您尝试的内容真正满足您的要求。