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

时间:2013-12-10 11:00:08

标签: c++ c++11 move-semantics

我正在尝试为具有两个仅移动成员的类编写移动构造函数。难点在于其中一个成员拥有对另一个成员的引用,因此一旦它们被移动,其中一个成员就会引用一个不再存在的对象:

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_;
};

有没有办法处理这种情况?基本上,当引用对象本身移动时,引用对象需要将其引用更新为移动版本。

1 个答案:

答案 0 :(得分:2)

解决此问题的最简单方法是亲吻MyClass再见的价值成员。

如果你只是在这里使用std::unique_ptr<Server>std::unique_ptr<Client>,那么其余的就很自然了 - 因为Server对象本身永远不会被移动,而只有MyClass对象的指针被{{{ 1}},您无需更新Client中的任何内容。