我可以使赋值运算符像复制构造函数一样工作吗?

时间:2014-04-14 14:47:09

标签: c++

你好,我得到了一个类似于以下的课程:

class myClass{
public:
 //other consturctors

 //copy constructor:
 myClass (const myClass & x)
 : C1(x.C1), C2(x.C2), C3(x.C3), S1(x.S1) {};

 //other functions

 myClass & operator = (const myClass & x);

private:
 const otherClass1 C1;
 const otherClass2 C2;
 const otherClass3 * C3;
 string S1;
}

我的问题在于assingment运算符,因为编译器不允许我像复制构造函数那样执行它。这是问题,因为我需要分配的类并没有实现分配运算符,我无法编辑它们所以我不能这样做:

myClass & operator = (const myClass & x) {
 C1=x.C1; // -> compile error
 C2=x.C2; // -> compile error
 C3=x.C3;
 S1=x.S1;
 return *this;
}

所以我试图实现assign运算符,如:

myClass & operator = (const myClass & x) {
 static myClass tmp(x);
 return tmp;
}

althoght它的工作一点点,我认为它在我的程序中引起了一些问题,特别是插入myClasses的矢量并不能很好地工作。

你们可以给我建议如何正确地让分配操作员像我需要的那样工作吗? (删除旧的myClass并使myClass(copy)不再是旧的,或以某种方式使用以下语法分配类:C1(copy.C1)... {})?

编辑:从C1和C2中删除const似乎是解决我的问题的方法。

2 个答案:

答案 0 :(得分:1)

您有const数据成员,因此您无法在赋值运算符中更改它们。 另一个值得注意的事情是你在拷贝构造函数中做了浅拷贝,你应该避免。你只是在一个指向另一个指针的地方复制地址,这意味着两个指针都指向同一个地址,如果以后一个指针删除它,另一个将成为悬空指针。

答案 1 :(得分:0)

忘记静态的第3段代码,你应该尝试让第二段代码工作,并解决2个编译错误。

如果删除constness不起作用,则可以在堆上存储C1和C2。

const otherClass1 * C1;
const otherClass2 * C2;

将它们更改为指针并在需要的地方新建/删除它们,这样你就可以使用复制构造函数来代替赋值运算符(你说这些类不存在)