我试图重载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 ...?
答案 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>