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

时间:2011-07-18 13:58:42

标签: c++

  

可能重复:
  Operator overloading

编辑2

我错误地使用了insert(...),我实际上并不需要'='运算符。抱歉浪费人们的时间。我已经投票结束..仍然有2票。请投票。

修改

我想要'='运算符的原因是我可以在Derivation对象的向量上使用insert(...)函数。目前我的编译器说:

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

我创建了'=='和'<'之前我自己的类的运算符,但我正在努力创建一个'='运算符。我的类看起来像这样(忽略愚蠢的变量名):

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

我想知道我需要放入什么

// What do '=' return?  An object of the class right?
Derivation& operator=(const Derivation &d) const {
    // something....
}

非常感谢。

7 个答案:

答案 0 :(得分:2)

这取决于你,真的。您需要操作员做什么?您想要返回引用,还是想要副本?

编辑:请注意这是修辞。您使用此向量的内容将决定您是否需要引用或副本。例如,如果插入的对象在从向量中移除之前的任何位置都会超出范围,那么您将需要一个副本。如果没有,并且您希望在更改向量中的实例时影响原始对象,则需要引用。希望有所帮助。

答案 1 :(得分:2)

首先删除const ... 然后如果你真的需要一个复制操作符,做一些类似的事情并添加你自己的逻辑(这样它就不能完全按照编译器生成的复制操作符完成):

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

答案 2 :(得分:2)

首先,赋值运算符可能不应该是const -

其次,赋值运算符通常会返回对赋值的对象的非const引用(* this)

答案 3 :(得分:2)

你不需要一个。编译器生成的一个就可以了。

答案 4 :(得分:1)

实现赋值运算符的标准方法是复制和交换。 这具有使面向异常和自我赋值时赋值操作符正确的最简单方法的优点。它还根据复制构造函数定义赋值操作,从而减少了在向类中添加额外成员时需要更改代码的位置数。

无论如何 - 这就是你的情况:

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

答案 5 :(得分:0)

重载赋值运算符你应该这样做

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

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

偏差a,b,c; //某事

c = b = a;

答案 6 :(得分:0)

因为 - @jalf没有提出答案,这里是:)

Derivation& operator=(const Derivation &d) {
  // something....
  return *this;
}

您需要返回对此实例的引用。 this是一个关键字,它包含指向运算符所在的实例的指针。