не может перегрузить оператор + на 2 классах c ++ eclipse

Я пытаюсь перегрузить оператор + на 2 Фильмах, и по какой-то причине он всегда застревает, когда я пытаюсь получить их код, метод, который работает для других классов, так что, вероятно, он связан с перегрузкой.
Я хочу добавить несколько фильмов вместе и собрать их все в новый фильм.
Я обнаружил, что проблема была с оператором =, а не +, он застрял .. вот код:
Вот основной класс, пытающийся перегружать несколько фильмов:

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.
ПОМОГИТЕ..?

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 мы представили концепцию движения. Это классический случай, когда объект перемещается (а не копируется). Это должно быть оптимально эффективно.

Но в качестве альтернативы вы можете реализовать operator+= который сочетает в себе два вышеуказанных утверждения.

 Movie& Movie:: operator+= (const Movie& other) {
{
// Add other to *this;
return *this;
}

Здесь мы можем вернуться по ссылке. Потому что мы возвращаем ссылку на текущий объект. Теперь измените свой код в цикле.

            {
// Old code
// g =  final + (*it2);
// final = g;

// New Code
final += (*it2);
}
0

Другие решения

В Movie& Movie:: operator+ (const Movie& other) вы возвращаете ссылку на локальный объект Movie toReturn, Вы не должны возвращать ссылку на локальный объект, который расположен в стеке функции, вне функции. Как функция выходит toReturn Будет вызван деструктор, а возвращенная вами ссылка будет указывать на разрушенный объект.

Правильный operator+ декларация Movie Movie:: operator+ (const Movie& other), Другой код останется таким же.

0

По вопросам рекламы [email protected]