Я пытаюсь перегрузить оператор + на 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.
ПОМОГИТЕ..?
Вы возвращаете ссылку на локальное значение.
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);
}
В Movie& Movie:: operator+ (const Movie& other)
вы возвращаете ссылку на локальный объект Movie toReturn
, Вы не должны возвращать ссылку на локальный объект, который расположен в стеке функции, вне функции. Как функция выходит toReturn
Будет вызван деструктор, а возвращенная вами ссылка будет указывать на разрушенный объект.
Правильный operator+
декларация Movie Movie:: operator+ (const Movie& other)
, Другой код останется таким же.