重载运算符+ c ++ eclipse

时间:2015-12-05 10:00:04

标签: c++ eclipse operators overloading

我试图重载operator +。 重要的是,operator +获取我想要的数据,但是一旦我将它发送到operator =,其中的所有指针都会因某种原因被删除。

Movie& Movie:: operator+ (const Movie& other) {

Movie toReturn,toCheck;
Worker* toAdd;
std::list<Worker*>::iterator checkSecond;
length > other.getLength() ?  toReturn=*this, toCheck=other : toReturn =  
other , toCheck = *this;

//I WANT TO TAKE THE LONGER MOVIE, AND ADD THE WORKERS FROM THE SHORTER 
  MOVIE TO THAT MOVIE

if(toCheck.getNumOfWorkers() > 0 ) //LOOK FOR WORKERS IN SHORT MOVIE

{
for (checkSecond=toCheck.getWorkersInMovie().begin(); checkSecond != 
toCheck.getWorkersInMovie().end(); ++checkSecond)
           {
                toAdd= (*checkSecond);
                toReturn.addWorker(toAdd);
                toAdd = NULL;


            } //END FOR
    }
}
}

*this=toReturn;
cout << "this is what my new object has after +" <<endl; 
this->printMovie(); //PRINTS EXACTLY WHAT I EXPECT, WITH NEW WORKERS
return *this;

}

但是当我发送给运营商=它没有按预期复制时,说工人数是0。 MOVIE BOTH = MOVIEFIRST + MOVIETOADD

Movie& Movie:: operator= (const Movie& other) {

WHEN IT GETS HERE, MOVIE OTHER GETS DELETED..
return *this;

}

复制构造函数在所有场景中都按预期工作:

Movie::Movie(const Movie& toCopy) {

  cout << "inside copy" << endl;
 *this=toCopy;
}

HELP ...?

2 个答案:

答案 0 :(得分:2)

+等表达式调用运算符A + B。从语义上讲,这个表达式不应该改变A的状态,而是返回一个表示总和的新对象。

因此,重载+运算符的正确签名应如下:

Movie Movie::operator+ (const Movie& other) const { }

如果你想避免创建这个临时对象,那么你不应该重载+运算符,而应该重载+=,如下所示:

Movie& Movie::operator+= (const Movie& other) { }

由于+ =具有赋值语义,因此您可以修改该对象。

遵循此规则将帮助您解决您在代码中看到的问题。

答案 1 :(得分:1)

1。如果您希望它正常工作,您必须正确重载operator =。您当前在operator =您正在执行的操作=重载正在返回其当前状态。您没有复制变量“other”中的值。这是你应该尝试做的:

    Movie& Movie:: operator= (const Movie& other) {

    //COPY EACH VALUE FROM 'OTHER' TO 'THIS'

    return *this;

    }

你没有分配任何东西!将这些值分配给 this 后,您必须返回该值。

2。您的复制构造函数应该复制它接收的对象的每个元素作为参数 - 否则不需要复制构造函数,您应该使用编译器为您创建的复制构造函数。 / p>