如何将相互依赖的对象移动到一起并维护内部引用

How to move inter-dependent objects together and maintain internal references

本文关键字:到一起 移动 维护 引用 内部 对象 依赖      更新时间:2023-10-16

我正试图为一个有两个仅移动成员的类编写移动构造函数。困难在于,其中一个成员持有对另一个成员的引用,因此一旦他们都被移动,其中一名成员就引用了一个不再存在的对象:

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中的任何内容。