不能在2个类c ++ eclipse上重载operator +

时间:2015-12-04 20:07:27

标签: c++ operators copy-constructor listiterator

我试图在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 ..?

2 个答案:

答案 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 ++编译器对返回的值(NRVORVO)进行了非常好的优化。其次,在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)。其他代码将保持不变。