在C ++中为类创建赋值(=)运算符


Creating an assignment (=) operator for class in C++

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Operator overloading

编辑2

我使用insert(…)不正确,实际上不需要"="运算符。抱歉浪费了人们的时间。我投票决定关闭……剩下2票。请投票表决。

编辑

之所以需要"="运算符,是因为我可以在派生对象的向量上使用insert(…)函数。现在我的编译器说:

/usr/include/c++/4.2.1/bits/stl_algobase.h:283: error: no match for 'operator=' in '* __result = * __first'

我以前为自己的类创建过"=="和"<"运算符,但我正在努力创建一个"="运算符。我的类如下(忽略愚蠢的变量名):

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;
}

您需要返回对此实例的引用。this是一个关键字,用于保存指向操作员正在执行的实例的指针。


要重载赋值运算符,应执行此操作

1
2
3
4
Derivation& operator=(const Derivation &d)  {
    // something....
   return *this
}

这将允许你做类似的事情。

偏差A、B、C;/某物

C=B=A;