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

时间:2010-10-01 16:47:37

标签: c++

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

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

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

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

MyClass obj(*this);
.
.
.
obj = MyClass(*this);

7 个答案:

答案 0 :(得分:14)

有一种方法可以使用引用,使用reference_wrapper。所以

    T& member;

变为

    std::reference_wrapper<T> member;

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

答案 1 :(得分: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;
}

答案 2 :(得分:10)

是的,如果您需要支持作业,那么将其作为指针而不是参考几乎是您唯一的选择。

答案 3 :(得分:5)

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

编辑: @“Steve Jessop”对使用PIMPL习惯用法(使用“d指针”的私有实现)如何解决问题提出了有效的观点。在赋值中,您将删除旧的实现,并从源对象的d指针创建一个新的复制构造。

答案 4 :(得分:2)

您需要实现一个复制构造函数并初始化该复制构造函数中的引用,以指向与原始对象相同的引用。

答案 5 :(得分:1)

我会把它变成一个boost :: shared_ptr。你可以对这些非常粗暴,他们会照顾好自己。而使用原始指针意味着您必须担心该对象保持活着

答案 6 :(得分:0)

正如其他人所提到的,可以使用std :: reference_wrapper。也可以使用辅助函数std :: ref()和std :: cref()。与其他帖子不同,C ++ 03在名称空间std :: tr1中引入了reference_wrapper,ref()和cref(),因此如果您不使用C ++ 11或更高版本,则可以选择。