我有一个存储对其父级的引用的类,引用在构造函数中传递。如果我尝试复制一个实例,我会收到错误“错误C2582:'operator ='function is unavailable”,大概是指向不可分配的引用。
有没有解决方法,或者我只是将变量更改为指针而不是引用?
例如(过度简化但我认为有关键点):
class MyClass
{
public:
MyClass(OtherClass &parent) : parent(parent) {}
private:
OtherClass &parent;
};
MyClass obj(*this);
.
.
.
obj = MyClass(*this);
答案 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或更高版本,则可以选择。