我已经阅读了很多内容,如果你需要一个赋值运算符,那么就不要使用引用成员变量。我知道你不能重新分配一个引用,但是你不能通过在赋值运算符中重新分配该引用变量中的所有数据来解决这个问题,因为你不能重新赋值这个引用吗?
这样的事情:
class MyClass {
AnotherClass& someObject;
...
public:
...
MyClass& operator= (const MyClass& that) {
if (&that != this) {
this.someObject.member1 = that.someObject.member1;
this.someObject.member2 = that.someObject.member2;
}
return *this;
}
}
这是否存在问题,或者尝试以这种方式进行分配会出现问题?
答案 0 :(得分:1)
是的,你可能会遇到问题。假设您有两个MyClass
实例A和B,它们共享相同的AnotherClass
对象。如果你给A分配了一个不同的值,那么你就会搞砸B的成员。
这个变量用于什么?
如果许多MyClasses需要共享和修改相同的AnotherClass,请使用AnotherClass *
。然后只需将指针重定向到赋值。你必须跟踪有多少MyClasses拥有AnotherClass,所以要么在AnotherClass中跟踪它,要么使用某种“智能”指针。
如果AnotherClass太大而无法存储许多副本,或者存在许多MyClass实例,那么const AnotherClass *
会更好。同样,你必须跟踪存在多少指针,这样你就不会泄漏内存。
如果它很小,MyClasses很少,并且不需要在它们之间共享:使用普通对象。性能影响可能微不足道。