如何将相互依赖的对象移动到一起并维护内部引用
How to move inter-dependent objects together and maintain internal references
我正试图为一个有两个仅移动成员的类编写移动构造函数。困难在于,其中一个成员持有对另一个成员的引用,因此一旦他们都被移动,其中一名成员就引用了一个不再存在的对象:
class Server : noncopyable
{
};
class Client : noncopyable
{
public:
Client(Server& server) : server_(server) {}
Client(Client&& other) : server_(std::move(other.server_)) {}
std::reference_wraper<Server> server_;
};
class MyClass : noncopyable
{
public:
MyClass()
: server_(),
client_(server_) {}
// destroys other.server_ which client uses before and after move
MyClass(MyClass&& other)
: server_(std::move(other.server_)),
client_(std::move(other.client_))
private:
Server server_;
Client client_;
};
有什么好办法来处理这种情况吗?基本上,当引用对象本身被移动时,它需要将其引用更新为移动到的版本。
解决此问题的最简单方法是与MyClass
的值成员吻别。
如果您只是在这里使用std::unique_ptr<Server>
和std::unique_ptr<Client>
,那么其余的就很自然了——因为Server
对象本身从未移动过,而只是MyClass
持有的指向它的指针,所以您不需要更新Client
中的任何内容。
相关文章:
- 将对象移动到std::shared_ptr
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 安全到标准:移动会员?
- 碱基对映射 - 将 argv[i] 移动到整数或字符作为输入
- 设计将引用元素移动到开头的数据结构.C++
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 将 std::array 移动到另一个 std::array
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 将条纹集成到QT移动应用程序中
- QT:将信号连接到具有移动语义的插槽
- QT防止QDialog/窗口与MainWindow一起移动
- 在c++中将两个对象添加到一起
- 如何将相互依赖的对象移动到一起并维护内部引用
- 如果检测到鼠标移动,请在 MFC C++对话框窗口中显示光标
- DirectX 汽车与世界一起移动
- 在CUDA中将字符串添加到一起
- 阻止子窗口与其父窗口一起移动
- 将2个数组添加到一起时结转出现问题
- C++/MFC 如何将多个文件从 PC 复制到 WinCE(移动设备)