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

C++ 我可以让赋值运算符像复制构造函数一样工作吗?,c++,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: cons

你好,我有一节课,看起来像这样:

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;
}
myClass & operator = (const myClass & x) {
 C1=x.C1; // -> compile error
 C2=x.C2; // -> compile error
 C3=x.C3;
 S1=x.S1;
 return *this;
}
我的问题是assingment操作符,因为编译器不允许我像在复制构造函数中那样做。这是个问题,因为我需要分配的类没有实现assign运算符,我无法编辑它们,所以我不能这样做:

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;
}
myClass & operator = (const myClass & x) {
 C1=x.C1; // -> compile error
 C2=x.C2; // -> compile error
 C3=x.C3;
 S1=x.S1;
 return *this;
}
因此,我尝试实现赋值运算符,如:

myClass & operator = (const myClass & x) {
 static myClass tmp(x);
 return tmp;
}
虽然它工作了一点,但我认为它在我的程序中造成了一些问题,特别是插入到我的类的向量中,效果不是很好

你们能给我一些建议,如何正确地让分配操作员按照我的需要工作吗?(删除旧的myClass并使myClass(copy)成为旧类的istead,或者以某种方式使用以下语法分配类:C1(copy.C1)…{})


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

您有常量数据成员,因此无法在赋值运算符中更改它们。
另一件值得注意的事情是,您正在复制构造函数中进行浅层复制,应该避免这种情况。您只是将一个指针中的地址复制到另一个指针,这意味着两个指针将指向同一个地址,如果以后有一个指针将其删除,另一个指针将成为悬空指针。

忘记第三段静态代码,您应该尝试使第二段代码正常工作,并解决两个编译错误

如果删除常量不起作用,可以将C1和C2存储在堆上

const otherClass1 * C1;
const otherClass2 * C2;

将它们更改为指针,并在需要时新建/删除它们,这样您就可以将复制构造函数与新的一起使用,而不是赋值运算符(您说这些类不存在赋值运算符)

您的类具有
const
数据成员。所以赋值没有任何意义。你所有的问题都是因为这些成员是常量,所以它们不能被赋值。好吧,根据你使用的是C++11,它必须是移动可赋值还是复制可赋值才能进入向量。如果您有常量成员,则无法使其工作。juanchopanza对常量数据成员有一个有效的观点。此外,复制C3指针也很危险,赋值后这两个对象将有一个指向同一个otherclass3实例的指针。谁拥有它,谁将删除它?最后一个带有静态tmp var的代码看起来显然是错误的。您根本没有更改this指针,因此没有赋值。返回值仅用于方法链接(在本例中,它是一个运算符,但原理是相同的。当您使用'a=b=c'时,它是b的运算符=的返回值,用作a的运算符=的参数。)