2014-12-11 2 views
0

Когда я вызываю r--; Мой объект сбрасывает значения до 0. Любые идеи?Перегрузка оператора (-) устанавливает переменные в 0

class MyClass : Superclass { 
private: 
    int length; 
    int width; 

public: 
    MyClass() { 
     length = 0; 
     width = 0; 
    } 

    MyClass (int x, int y):Superclass(x/2,y/2){ 
     length = x; 
     width = y; 

    } 

    MyClass operator--(int) { 
     MyClass temp = *this; 
     temp.length --; 
     temp.width --; 
     return temp; 
    }; 
}; 

Создание и пытается класс:

MyClass *r = new MyClass(2,3); 
r--; // now length and width = 0 (should be 1,2) 
+5

Как вы написали здесь, 'r -' уменьшает указатель, поэтому 'r' больше не указывает на выделенный вами объект. Попытка использовать или смотреть на то, на что указывает, дает неопределенное поведение. –

+2

Вашему оператору необходимо изменить 'this-> length' и' this-> width', а не те, что указаны в копии. Оператор postfix должен изменить 'this' и вернуть копию состояния объекта ранее, поэтому вам нужно заменить' temp.length -; 'на' length -; 'и ditto для' width'. – cdhowie

+0

BTW: Вы должны реализовать 'MyClass :: operator - (int)' с 'MyClass :: operator -()'. – Deduplicator

ответ

6

Во-первых, оператор не уменьшаем объект это называется, но копия он собирается вернуться. Он должен оставить это в покое (чтобы вернуть предыдущее значение) и уменьшаем объект:

MyClass temp = *this; 
this->length--; // this-> is optional 
this->width--; 
return temp; 

Во-вторых, r является указателем. r-- уменьшает указатель, а не объект, на который указывает, оставляя его указаным на недопустимое расположение памяти. Разделение его впоследствии дает неопределенное поведение.

Я не знаю, почему вы используете new здесь; вы почти наверняка просто хотите переменную:

MyClass r(2,3); 
r--; // should behave as expected. 

Если вы действительно хотите указатель на какой-то причине вам придется разыменования его, чтобы получить объект:

(*r)--; 

и не забыть для удаления объекта после его завершения. И не раньше.

+2

Он по-прежнему не работает, потому что 'operator - (int)' изменяет 'temp' not' * this' –

+0

@JonathanWakely: Хорошо, я этого не заметил. –

+0

Просто изучая C++, поэтому не уверен в перегрузке еще ... Есть ли лучший способ написать его? –

Смежные вопросы