c++ - 如何将相互依赖的对象 move 在一起并维护内部引用

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

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

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

遇到这种情况有什么好的办法吗?基本上,引用对象在 move 时需要将其引用更新为 move 到的版本。

最佳答案

解决这个问题最简单的方法是 Kiss MyClass 的值成员再见。

如果您只是使用std::unique_ptr<Server>std::unique_ptr<Client>相反,剩下的就很自然了 - 正如 Server对象本身永远不会 move ,只是 MyClass 所持有的指向它的指针被 move 。 ,您不需要更新 Client 中的任何内容.

关于c++ - 如何将相互依赖的对象 move 在一起并维护内部引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20492629/

相关文章:

c++ - std::function 无法区分重载函数

c++ - shared_ptr 从 unique_ptr 到数组

c++ - 类型转换和使用 std::move() 的区别?

c++ - 扩展 std::vector 以从其他 vector 类型 move 元素

c++ - 计算文件中单词频率的优雅方法

c++ - 将命令行参数/fstream 传递给函数

c++ - 将数组的值分配给C++中另一个数组的索引

c++ - 将参数 move 到数据成员 : Take parameter by copy or rvalue-ref?

c++ - 在 linux mint 上部署 C++ wxWidgets

c++ - x64 转换后指针截断