2016-03-23 3 views
4

Может кто-нибудь объяснить мне, почему мой перегруженный ++ (предварительная версия) не обновляет значение? Отрывок, как это:Перегруженный оператор ++ не работает в C++

circle circle:: operator++() 
{ 
    Area = Area * 2.0; 
    return *this; 
} 
///////////////////////////// 

int main() 
{ 
    class circle c1(4, 1, -1), c2(12, 4, 6); 
    c1.output(); 
    c1++; 
    c1.output(); 

    system("pause"); 
    return 0; 
} 
+4

Вы не называете постфиксную версию 'c1 ++'? – EdChum

+1

Также вам необходимо проверить свои [подписи] (http://en.cppreference.com/w/cpp/language/operator_incdec), поскольку ваша версия не соответствует – EdChum

+0

. Подпись для post increment 'c1 ++' требует, чтобы вы реализовали ' circle & circle :: operator ++ (int) '. Ваша текущая реализация 'operator ++()' будет работать для pre increment '++ c1' – Vishal

ответ

5

signature вашего оператора перегрузки должны быть:

circle& operator++(); // return by reference and this is prefix. 

Но вы используете суффикса, так и должно быть:

circle operator++ (int); // int is unused 

Изменение подписи является недостаточно, поскольку вы реализуете префиксную логику, напрямую изменяя значение без сохранения начального значения. Поэтому, если вы используете оператор postfix с вашей реализацией в комбинированном выражении, например (c++).output(), он не будет уважать ожидаемую семантику.

Здесь implemetnation обоих версии:

circle& operator++() { // prefix 
    Area = Area * 2.0; // you can change directly the value 
    cout << "prefix"<<endl; 
    return *this;  // and return the object which contains new value 
} 

circle operator++ (int) { // postfix 
    circle c(*this);  // you must save current state 
    Area = Area * 2.0; // then you update the object 
    cout << "postfix"<<endl; 
    return c;   // then you have to return the value before the operation 
} 

а вот online demo, чтобы показать разницу между обоими.

+1

Правда, но это не изменит результат. OP не использует выражение напрямую. Ошибка отмечена в комментариях. – juanchopanza

+0

Do't circle & operator ++(); требуется параметр класса или типа перечисления? –

+0

@TaimurAhmed да действительно для приращения postfix. Я завершаю свой ответ, когда вы печатали. – Christophe

7

Это потому, что вы перегружаете префикс и вызываете постфикс. Вам необходимо позвонить ++c1;. Для использования c1++; вам нужно перегружать суффикс, а также:

circle operator++ (int); 
+0

Можете ли вы уточнить свой ответ, чтобы упомянуть о другом возможном исправлении? ОП может означать вызов 'c1 ++;' – quamrana

+0

Да, я должен это сделать. благодаря – DimChtz

0

Вот как версия префикса и после исправления. И вы можете добавить код в случае вызова типа c1 ++ (1); (конечно, если необходимо)

circle circle:: operator++() // prefix version 
{ 
    Area = Area * 2.0; 
    return *this; 
} 

circle& circle::operator++(int n) { //postfix version 
    if(n != 0)    // Handle case where an argument is passed. 
     //some code 
    else 
     Area = Area * 2.0;  // Handle case where no argument is passed. 
    return *this; 
} 


int main() 
{ 
    class circle c1(4, 1, -1), c2(12, 4, 6); 
    c1.output(); 
    c1++; 
    ++c1; 
    c1.output(); 

    system("pause"); 
    return 0; 
} 
Смежные вопросы