Fehler beim Überladen mit Postfixschreibweise (++val)



  • Das Beispiel aus dem Buch(Bücher) gibt ein undefiniertes Wert aus.
    class myComplex {
    private:
    double _real;
    double _image;

    public:
    myComplex( double val1=0.0, double val2=0.0 ) {
    _real = val1; _image = val2;
    }

    void print_Complex(){
    cout << _real << "+" << _image << "\n";
    }

    // Postfix-Operator ++
    myComplex& operator++(int) {
    myComplex tmp(*this);
    _real++;
    _image++;

    return tmp;
    }
    };

    int main() {
    myComplex val1(1.1, 2.2);
    ++val1;

    cout << "Wert von val1: "; val1.print_Complex();

    val1++;
    cout << "Wert von val1: "; (val1++).print_Complex();

    val1++.print_Complex() schreibt eine Zufalszahl und nicht 3.1 + 4.2i
    Hat das mit dem neuen C++ Kompiler zu tun ? (Visual C++ 2008 Express Edition)
    Danke



  • Eigentlich val++



  • Ist eine Fehlermeldung, ein cpp-Tag oder eine Frage zu viel verlangt? Naja, das Problem wird wohl bei print_Complex() liegen, da du auf eine Variable zugreifen möchtest, die nicht in deinem Scope liegt. Also entweder _real und _image private lassen und eine Getter()- bzw. Setter()-Methode schreiben oder die Variablen public machen.



  • Lösung ist ja nun schon genannt, aber du scheinst mehrere Fehler gemacht zu haben:

    class myComplex
    {
    private: 
      double _real; 
      double _image; 
    public: 
      myComplex(double val1=0.0, double val2=0.0) //sehr ungünstige variablennamen!
      { 
        _real = val1; _image = val2; 
      }
      void print_Complex()
      { 
        cout << _real << " + " << _image << "i\n";
      } 
    
      // Präfix-Operator ++ 
      myComplex& operator++()
      {
        ++_real;
        ++_image; //das hier hat iwie wenig mit mathematik zu tun, aber ok...
        return *this;
      }
    
      // Postfix-Operator ++ 
      myComplex operator++(int)
      { 
        myComplex NRVO(*this);
        ++*this; //wird über präfix-operator definiert
        return NRVO; 
      } 
    };
    
    /*main.cpp*/
    int main()
    { 
      myComplex val1(1.1, 2.2); 
      ++val1; //2.1 + 3.2i
    
      cout << "Wert von val1: "; //print 2.1 + 3.2i
      val1.print_Complex(); 
    
      val1++; //3.1 + 4.2i
      cout << "Wert von val1: ";
      (val1++).print_Complex(); //print 3.1 + 4.2i
      //4.1 + 5.2i
    }
    

    bb

    PS: Gäbe noch vieles, was man verbessern könnte, aber ich nehm mal an, du gehst gerade nen Tuturial / Buch durch!?

    edit: myComplex& operator++(int) -> myComplex operator++(int)



  • Vielen Dank
    (habe in zwei Bücher die Beispiele abgeschrieben(Jürgen Wolf;Seite 369))



  • rosic schrieb:

    Vielen Dank
    (habe in zwei Bücher die Beispiele abgeschrieben(Jürgen Wolf;Seite 369))

    also verstehst du jetzt, wieso es nicht ging und wieso es so geht?



  • Einen Haken hat das Programm noch:

    unskilled schrieb:

    // Postfix-Operator ++ 
      myComplex& operator++(int)
      { 
        myComplex NRVO(*this);
        ++*this; //wird über präfix-operator definiert
        return NRVO; 
      }
    

    Der Postfix-Increment-Operator sollte keine Referenz zurückgeben. Ich schätze, das ist bis jetzt übersehen worden.

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    Einen Haken hat das Programm noch:

    unskilled schrieb:

    // Postfix-Operator ++ 
      myComplex& operator++(int)
      { 
        myComplex NRVO(*this);
        ++*this; //wird über präfix-operator definiert
        return NRVO; 
      }
    

    Der Postfix-Increment-Operator sollte keine Referenz zurückgeben. Ich schätze, das ist bis jetzt übersehen worden.

    Gruß,
    SP

    Danke - richtig geraten ;o)
    habs geändert



  • Danke an Kóyaánasqatsi, unskilled und Sebastian Pizer



  • rosic schrieb:

    (habe in zwei Bücher die Beispiele abgeschrieben(Jürgen Wolf;Seite 369))

    WTF, du hast recht... Vielleicht sollte man das Buch wirklich der Verbrennung zuführen...

    Felix


Anmelden zum Antworten