使用引用类型的成员变量复制C++类

Mr.*_*Boy 13 c++

我有一个类存储对其父级的引用,引用在构造函数中传递.如果我尝试复制一个实例,我会收到一个错误"错误C2582:'operator ='function is unavailable",大概是指向不可分配的引用.

有没有解决方法,或者我只是将变量更改为指针而不是引用?

例如(过度简化,但我认为有关键点):

class MyClass
{
public:
 MyClass(OtherClass &parent) : parent(parent) {}
private:
 OtherClass &parent;
};

MyClass obj(*this);
.
.
.
obj = MyClass(*this);
Run Code Online (Sandbox Code Playgroud)

Tie*_*dye 14

有一种方法可以做到并且仍然使用引用,使用a reference_wrapper.所以

    T& member;
Run Code Online (Sandbox Code Playgroud)

    std::reference_wrapper<T> member;
Run Code Online (Sandbox Code Playgroud)

引用包装器基本上只是可​​重新分配的引用.


MSN*_*MSN 13

我根本不推荐这个

但如果你真的想要这样做:

#include <new>

MyClass::MyClass(const MyClass &rhs): parent(rhs.parent)
{
}

MyClass &MyClass::operator=(const MyClass &rhs)
{
    if (this!=&rhs)
    {
        this->~MyClass();
        new (this) MyClass(rhs);
    }

    return *this;
}
Run Code Online (Sandbox Code Playgroud)

  • 警告:这种方法是未定义的行为。“如果,...在原始对象占用的存储位置创建一个新对象,...将自动引用新对象,并且一旦新对象的生命周期开始,就可以用于操作新对象对象,如果: ... **原始对象的类型**不是 const 限定的,并且,如果是类类型,**不包含任何类型为 const 限定的非静态数据成员或引用类型** ...” (2认同)

Jer*_*fin 10

是的,如果你需要支持赋值,那么将它作为指针而不是引用几乎是你唯一的选择.


Joh*_*itb 5

是的只是使成员成为指针.引用将无法重新设置,并且没有解决方法.

编辑: @"Steve Jessop"使用PIMPL习语(使用"d指针"进行私有实现)如何解决问题.在赋值中,您将删除旧的实现,并从源对象的d指针创建一个新的复制构造.

  • "没有解决办法".为此,我将提到错误实现`operator =`以显式调用析构函数,然后使用placement new和复制构造函数构造的可能性.或者更有效的是,使用pimpl并让`operator =`进行复制和交换.impl本身不需要`operator =`,仍然可以使用引用.尽管如此,如果这是pimpl所希望的唯一功能,那么它还是有很多样板写的...... (2认同)