我试图在2部电影上重载operator +,并且由于某种原因,当我试图获取它们的代码时,它总是卡住,这个方法适用于其他类,所以它可能与超载。 我想一起添加几部电影,并将它们全部收集到一部新电影中。 我发现问题出在operator =,而不是+,它被卡住..这里是代码: 这是试图超载几部电影的主要课程:
void MovieIndustry::addMoviesTogether() {
Movie final,g;
//moviesToAdd is a list of Movies.
for (std::list<Movie>::iterator it2=moviesToAdd.begin(); it2 !=
moviesToAdd.end(); ++it2) lookfor movie
{
g = final + (*it2);
final = g;
}
movies.push_back(final);
}
这是Movie.cpp的相关方法:
Movie& Movie:: operator+ (const Movie& other) {
Movie toReturn,toCheck;
// I left its code empty because the problem was with operator =
return toReturn;
}
Movie::Movie() {
m_classifier = NULL;
workersInMovie.empty();
genresOfMovie.empty();
numOfWorkers=0;
numOfGenres=0;
// TODO Auto-generated constructor stub
}
Movie& Movie:: operator= (const Movie& other) {
cout << "inside ======" <<endl; //prints this one
Worker* toAdd = NULL;
Genre* addGenre;
code = other.getCode(); //loses it here
cout <<"finihed ==== "<< endl; // it never gets to this line
return *this;
}
Movie::Movie(const Movie& toCopy) {
cout << "inside copy" << endl;
*this=toCopy;
}
我真的无法检测到这个问题,但是我发现它比在+方法中更好,所以它可能与addMoviesTogether方法有关。 HELP ..?
答案 0 :(得分:0)
您将返回对本地值的引用。
Movie& Movie:: operator+ (const Movie& other) {
// ^^^ returning a reference.
Movie toReturn,toCheck;
// ^^^^^^^^^^^^ this is a local object. This will
// be destroyed when the function exits
// so your reference will point at an object that
// has been destroyed.
return toReturn;
}
对于构造新值的operator+
,您应该按值返回。
Movie Movie:: operator+ (const Movie& other)
从技术上讲,这将导致复制。但这并不像看起来那么糟糕。首先,C ++编译器对返回的值(NRVO
和RVO
)进行了非常好的优化。其次,在C ++ 11中,我们引入了Movement的概念。这是一个经典案例,一个对象被移动(而不是复制)。这被认为是最佳效率。
但另外,你可以实现operator+=
,它结合了上述两个陈述。
Movie& Movie:: operator+= (const Movie& other) {
{
// Add other to *this;
return *this;
}
这里我们可以通过引用返回。因为我们返回对当前对象的引用。现在在循环中更改代码。
{
// Old code
// g = final + (*it2);
// final = g;
// New Code
final += (*it2);
}
答案 1 :(得分:0)
在Movie& Movie:: operator+ (const Movie& other)
中,您将返回对本地对象Movie toReturn
的引用。您不应该在函数外部返回对函数堆栈分配的本地对象的引用。当函数退出toReturn
时,将调用析构函数,并且您返回的引用将指向被破坏的对象。
正确operator+
声明为Movie Movie:: operator+ (const Movie& other)
。其他代码将保持不变。