Operator Überladung - Fragen



  • Okay, dann hab ich noch ne Frage. Woher weiß der Compiler dass wenn ich
    *return this;
    mache, er das richtige zurückgibt, sprich also die Werte:
    Wert[0]
    Wert[1]

    bzw. stimmt das überhaupt?

    Und noch ne 2. Frage. Nach dem ich das *return this; eingefügt hab und die Deklaration/Definition geändert hab, geht das
    Vektor1 + Vektor1 + Vektor1 + Vektor1;
    noch nicht wirklich. Der Compiler bringt zwar keinen Fehler, aber es kommt das selbe heraus wie
    Vektor1 + Vektor1;
    wahrscheinlich speichert er die Variable nicht, was mich zur nächsten Frage bringt. Wieso geht folgendes nicht?
    Vektor1 = Vektor1 + Vektor1;

    Gruß Giovanni



  • Ich würde sagen, das sind C++ Fragen und die haben in diesem Fall nichts mit dem BCB zu tun.



  • a) ist dies ein VCL Forum, welches VCL spezifische Probleme behandelt
    b) Für C++ spezifische Probleme ist das C++ Forum da
    c) Beachte für die Zukunft doch bitte die kleine Regel: Pro Thread 1 Frage und pro Frage 1 Thread.

    ->Verschoben



  • Dieser Thread wurde von Moderator/in junix aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



    Jede Instanz besitzt einen versteckten Parameter der auf die Instanz, also auf sich selbst zeigt.

    class A
    {
      int a;
    public:
      A foo(){return *this}; //gibt sich selbst zurück
    }
    
    int main()
    {
      A oa;
      oa.foo();
    return 0;
    }
    

    operator+ sollte den rückgabewert der Klasse besitzen:

    Vektor& operator+(Vektor& op1)
    {
      this->Wert[0] = op1.Wert[0];
      this->Wert[1] = op1.Wert[1];
    return *this;
    };
    

    So ist auch eine Verkettung möglich, wie Vektor1 + Vektor1 + Vektor1 + Vektor1;

    Wenn du fragen hast als her damit, find dass ich es komisch erklärt habe 😃
    gruß KaraHead



  • Also um nochmal auf die Frage am Anfang zurückzukehren:
    Du bist doch in der Klasse, zwar in einem anderen Objekt, aber in der KLasse, also darfst du auch auf die privaten Elemente zugreifen.

    Jetzt zum Rest:
    return *this gibt nicht wirklich wert[0] und wert[1] zurück, sondern das gesamte aktuelle Objekt. This ist ein pointer auf das aktuelle Objekt und all seine Attribute und Methoden werden durch *this zurückgegeben. An dieser Stelle muss das Objekt, was die Rückgabe erwartet natürlich von der gleichen Klasse oder einer Basisklasse sein.

    Die anweisung Vektor1 = ... funzt nicht, weil du auch den operator= überladen musst. C++ kreiert zwar STandartoperatoren, die hier aber nichts nützen, weil ein komplettes Array nicht vom Standart operator= übergeben werden kann.
    Warum vektor1 +vektor1 +vektor1+... nciht funzt, keine AHnung, müsste dafür mehr von deinem Prog sehn... 🙂



  • So, hier ist noch mal der Quelltext, bei dem das Überladen des + Operators nicht richtig funktioniert. Weiß aber nicht wieso. Hoffe jemand kann mir helfen.

    #include <iostream.h>
    #include <conio.h>
    
    class Vektor
    {
        private:
        int Wert[2];
    
        public:
        Vektor ();
        void SetVektor (int *);
        int* GetVektor ();
        Vektor operator + (Vektor);
    
    };
    
    Vektor::Vektor ()
    {
        Wert[0] = 0;
        Wert[1] = 0;
    }
    
    void Vektor::SetVektor (int *Vektor)
    {
        this->Wert[0] = Vektor[0];
        this->Wert[1] = Vektor[1];
    }
    
    int* Vektor::GetVektor ()
    {
        return &this->Wert[0];
    }
    
    Vektor Vektor::operator + (Vektor V)
    {
        this->Wert[0] = this->Wert[0] + V.Wert[0];
        this->Wert[1] = this->Wert[1] + V.Wert[1];
        return *this;
    }
    
    // ************************************************************************** //
    
    void main ()
    {
        int SetWert[2] = {1,2};
        int * GetWert;
    
        Vektor Vektor1;
        Vektor1.SetVektor(&SetWert[0]);
        GetWert = Vektor1.GetVektor();
    
        Vektor1 + Vektor1 + Vektor1 + Vektor1;
    
        cout << *GetWert;
        GetWert++;
        cout << "\n" << *GetWert;
    
        getch();
    }
    


  • Also ich hab mal deine klasse zum Laufen gebracht und alles was nutzlos war weggemacht:

    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    class vector
    {
        int value[2];
      public:
        vector(int va=0, int vb=0){value[0]=va;value[1]=vb;};
        vector operator+(vector v1);
        vector operator=(vector v1);
        void setVector(int v1[]);
        void show();
    
    };
    
    void vector::show()
    {
      cout<<"1. "<<value[0]<<"\n2. "<<value[1]<<endl;
    }
    
    void vector::setVector(int v1[])
    {
      value[0]= v1[0];
      value[1]= v1[1];
    }
    
    vector vector::operator+(vector v1)
    {
      vector sum;
      sum.value[0]= v1.value[0]+value[0];
      sum.value[1]= v1.value[1]+value[1];
    return sum;
    }
    
    vector vector::operator=(vector v1)
    {
      value[0]= v1.value[0];
      value[1]= v1.value[1];
    return *this;
    }
    
    int main()
    {
      int vv[2] = {1,2};
      vector v1,v2,v3;
      v1.setVector(vv);
      v2.setVector(vv);
      v3=v1+v2;
      v3.show();
      getch();
    return 0;
    }
    

    gruß KaraHead



  • Kann mir denn keiner helfen, finde den Fehler einfach nicht!



  • Aaaaaaaahh, eine Antwort. Danke, muss jetzt mal gleich ausprobieren!


Anmelden zum Antworten