【问题标题】:Implementing copy c'tor for shared ptr vector?为共享 ptr 向量实现复制 c'tor?
【发布时间】: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 的用例,并确保您尝试的内容真正满足您的要求。

标签: c++ class methods


【解决方案1】:

通常,您不会复制字符,因此 明显 更改很简单

Game::Game(const Game &other): dimensions(other.dimensions), board(other.board) {}

只要让矢量复制自己。但由于这是默认设置。您不需要任何自定义,因此,在您的类定义中,只需使用

Game(const Game &other) = default;
Game(Game &&other) = default;

然后您就会知道它快速、准确且没有错误。


既然你说你想要角色的副本,那就需要更多的努力。请注意,这仅在 `Character` 类不是派生自的情况下才有效。
Game::Game(const Game &other): dimensions(other.dimensions) {
    int board_size= dimensions.getRow()*dimensions.getCol();
    board.reserve(board_size);
    for (int i=0;i<board_size;++i)
    {
        board[i].push_back(std::make_shared<Character>(*other[i]));      
    }
}

【讨论】:

  • 如果你有两个指向同一个对象的指针没有意义,那么你应该使用std::unique_ptr(或直接使用对象)而不是std::shared_ptr
  • @Daniel,如果您想要单独的字符实例,您确定shared_ptr 正确描述了您的意图吗? shared_ptr 表示Character 有多个所有者,并且在所有所有者不再指向它之前,该角色不会被释放。 unique_ptr 意味着只有一个所有者,但在这种情况下,您可能希望一直回到允许 vector 拥有 Characters 并完全摆脱指针..
  • @Daniel 是的,但是您需要了解原始指针不好的原因以及在什么情况下不好以及为什么智能指针更好以及智能指针提供什么。盲目地遵循“始终使用智能指针”不会让你走得太远。话虽如此,我高度怀疑您根本不需要指针。只需使用std::vector&lt;Character&gt; 即可。
  • 很好的信息。该花絮消除了vector&lt;character&gt;,并表明智能指针是正确的方法。现在你只需要弄清楚谁负责管理CharacterCharactervector 中删除时会被释放)。如果是vectorstd::unique_ptr 可能是正确的选择。
  • 因为您的课程是多态的,所以仅此答案对您没有帮助。您需要提供一个克隆接口:stackoverflow.com/questions/12902751/…
猜你喜欢
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多