2016-03-23 19 views
4

Kann mir jemand erklären, warum mein überladener ++ (Vorversion) den Wert nicht aktualisiert? Snippet ist wie folgt:überladen ++ Operator arbeitet nicht in 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

Rufen Sie nicht Postfix-Version 'C1 ++'? – EdChum

+1

Sie müssen auch Ihre [Signaturen] (http://en.cppreference.com/w/cpp/language/operator_incdec) überprüfen, da Ihre Version nicht übereinstimmt. – EdChum

+0

Die Signatur für post increment 'c1 ++' erfordert die Implementierung von ' circle & circle :: operator ++ (int) '. Ihre aktuelle Implementierung von 'operator ++()' wird für Pre-Inkrement '++ c1' funktionieren. – Vishal

Antwort

5

Die signature Ihrer Überlastung Operator sein sollte:

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

Aber Sie postfix verwenden, soll es so sein sollte:

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

Ändern der Signatur nicht genug, weil Sie eine Präfixlogik implementieren und den Wert direkt ändern, ohne den Anfangswert zu speichern. Wenn Sie also den Postfix-Operator mit Ihrer Implementierung in einem kombinierten Ausdruck wie (c++).output() verwenden würden, würde dies die erwartete Semantik nicht berücksichtigen.

Hier ist die implemetnation beide Version:

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 
} 

Und hier ein online demo Unterschied zwischen den beide zu zeigen.

+1

True zurückgegeben werden, aber das würde das Ergebnis nicht ändern. OP verwendet den Ausdruck nicht direkt. Der Fehler wurde in den Kommentaren hervorgehoben. – juanchopanza

+0

Umkreist & operator ++(); Benötigen Sie einen Parameter der Klasse oder des Enum-Typs? –

+0

@TaimurAhmed ja in der Tat für das Postfix-Inkrement. Ich habe meine Antwort vervollständigt, während Sie getippt haben. – Christophe

7

Es ist weil Sie das Präfix überladen und rufen Sie das Postfix. Sie müssen ++c1; anrufen. Zur Nutzung c1++; Sie müssen auch die Postfix zu überlasten:

circle operator++ (int); 
+0

Können Sie Ihre Antwort aktualisieren, um die andere mögliche Lösung zu erwähnen? Das OP könnte bedeuten, 'c1 ++;' – quamrana

+0

Ja, ich sollte es tun. Vielen Dank – DimChtz

0

Hier ist sowohl Version Präfix und post fix. Und Sie können im Falle eines Anrufs einen Code wie c1 ++ hinzufügen (1); (natürlich, wenn benötigt)

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; 
}