C++中如何让类成员vector<shared_ptr<T>>拷贝后互相独立?
默认拷贝行为说明
你给出的Game类未自定义拷贝构造函数,编译器会生成默认拷贝构造,执行Game game2 = game1;时的行为如下:
- 两个
boardvector的地址完全不同:game1和game2是两个独立的对象,它们的成员变量本身就位于不同内存地址,且std::vector的拷贝构造会为新vector分配独立的底层存储数组,不存在两个vector地址相同的情况。 - 两个vector内部存储的
shared_ptr<Character>元素内容完全一致:拷贝vector时会逐个复制内部元素,shared_ptr的拷贝操作仅复制指针本身、增加对应托管Character对象的引用计数,不会生成新的Character实例,因此两个vector同位置的shared_ptr指向同一个Character对象。
独立需求实现说明
你提到的「vector地址不同但内部的shared_ptr元素内容完全一致」的效果,默认拷贝行为已经直接满足,不需要额外修改代码。
如果你需要更进一步让两个Game的Character实例也完全独立(即深拷贝整个对象结构),则需要自定义Game的拷贝构造函数,示例代码如下:
class Character { public: // 简单场景下使用编译器默认生成的拷贝构造即可 int health; // 其余成员... }; class Game { public: // 原有构造逻辑... // 自定义拷贝构造实现深拷贝 Game(const Game& other) : size(other.size) { board.reserve(other.board.size()); for (const auto& ptr : other.board) { // 复制Character实例,生成新的shared_ptr board.push_back(std::make_shared<Character>(*ptr)); } } // 如需支持拷贝赋值,也需要对应实现拷贝赋值运算符,遵循三五法则即可 private: int size; std::vector<std::shared_ptr<Character>> board; };
内容的提问来源于stack exchange,提问作者Saleh
相关产品推荐
相关产品推荐

