Creating an assignment (=) operator for class in C++
Possible Duplicate:
Operator overloading
编辑2
我使用insert(…)不正确,实际上不需要"="运算符。抱歉浪费了人们的时间。我投票决定关闭……剩下2票。请投票表决。
编辑
之所以需要"="运算符,是因为我可以在派生对象的向量上使用insert(…)函数。现在我的编译器说:
我以前为自己的类创建过"=="和"<"运算符,但我正在努力创建一个"="运算符。我的类如下(忽略愚蠢的变量名):
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Derivation { public: string rc; ImplementationChoice Y; vector<Derivation> X; vector<string> D; vector<string> C; vector<Player> P, O; vector<Attack> B; // various functions // ... }; |
我想知道我该穿什么
1 2 3 4 | // What do '=' return? An object of the class right? Derivation& operator=(const Derivation &d) const { // something.... } |
多谢。
你不需要。编译器生成的一个将做得很好。
首先,赋值运算符可能不应是常量--
其次,赋值运算符通常返回对赋值对象的非常量引用(*this)
首先删除常量…然后,如果您真的需要一个复制操作符,可以这样做,并添加您自己的逻辑(这样它就不完全执行编译器生成的复制操作符将要执行的操作):
1 2 3 4 5 6 7 8 9 10 11 12 | Derivation& operator=(const Derivation& other) { this->rc = other.rc; this->Y = other.Y; this->X = other.X; this->D = other.D; this->C = other.C; this->P = other.P; this->O = other.O; this->B = other.B; // ... return *this; } |
这取决于你,真的。你需要接线员做什么?您是要返回引用,还是要副本?
编辑:请注意这是反问。您使用这个向量的目的将决定您是否需要一个引用或副本。例如,如果您插入的对象在从向量中移除之前,在任何一点都会超出范围,那么您需要一个副本。如果没有,并且希望在更改向量中的实例时影响原始对象,则需要引用。希望能有所帮助。
实现分配运算符的标准方法是复制和交换。这样做的好处在于,它是最简单的方法,可以使赋值运算符在遇到异常和自赋值时是正确的。它还根据复制构造函数定义了赋值操作,从而减少了在类中添加额外成员时需要更改代码的位置的数量。
不管怎样-这里是你的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Derivation { public: string rc; ImplementationChoice Y; vector<Derivation> X; vector<string> D; vector<string> C; vector<Player> P, O; vector<Attack> B; //You need to add a swap function to your class void swap(Derivation& o) { rc.swap(o.rc); Y.swap(o.Y);//Assuming ImplementationChoice has a swap function (it should!) X.swap(o.X); D.swap(o.D); C.swap(o.C); P.swap(o.P); O.swap(o.O); B.swap(o.B); } Derivation& operator=(Derivation const& o) { Derivation copy(o); copy.swap(*this); return *this; } // various functions // ... }; |
既然-@jalf没有给出答案,就在这里:)
1 2 3 4 | Derivation& operator=(const Derivation &d) { // something.... return *this; } |
您需要返回对此实例的引用。
要重载赋值运算符,应执行此操作
1 2 3 4 | Derivation& operator=(const Derivation &d) { // something.... return *this } |
这将允许你做类似的事情。
偏差A、B、C;/某物
C=B=A;