Operator Überladung - Fragen



  • Hallo,

    wir machen in der Schule Operator Überladung, und ich habe dazu mal ein paar Fragen... ich danke euch schon mal im Voraus dafür, ist wirklich sehr nett!

    1. Frage

    class Vektor
    {
    [b]    private:
        int Wert[2];[/b]
    
        public:
        Vektor ();
        void SetVektor (int *);
        int* GetVektor ();
        void operator + (Vektor);
    
    };
    
    Vektor::Vektor ()
    {
        Wert[0] = 0;
        Wert[1] = 0;
    }
    
    void Vektor::SetVektor (int *Vektor)
    {
    [b]    this->Wert[0] = Vektor[0];
        this->Wert[1] = Vektor[1];[/b]
    }
    
    int* Vektor::GetVektor ()
    {
        return &this->Wert[0];
    }
    
    void Vektor::operator + (Vektor V)
    {
        Wert[0] = Wert[0] + V.Wert[0];
        Wert[1] = Wert[1] + V.Wert[1];
    }
    

    Wieso kann ich in der Funktion operator + auf die private Elementvariablen einer anderen Instanz zu greifen, ich versteh das irgendwie nicht, das ist doch nicht die aktuelle Instanz, sondern halt ne andere... ???



  • Wenn Du in einer Klasse Daten als privat deklarierst, möchtest Du dass Außerhalb der Klasse nicht darauf zugegriffen werden kann. Es ist nicht sichergestellt, dass ein anderer weiß, wie die Daten geändert werden dürfen, deshalb implementiert man für diese Daten Zugriffsmethoden. Derjenige der direkt mit der Klasse arbeitet, weiß aber in der Regel, wie auf die privaten Daten zugegriffen werden darf, deshalb ist es hier nicht unbedigt nötig über den umweg von Zugriffsmethoden zu gehen. Wenn Du eine andere Instanz hast, weißt Du ja trotzdem, wie die Klasse zu benutzen ist.

    Ein Tipp nebenbei:
    Ein Operator sollte in der Regel eine Referenz auf das aktuelle Objekt zurückliefern, damit man auch Verkettungen durchführen kann. Bei Deiner Version ist "a + b + c" nicht möglich, wenn Du eine Referenz auf das aktuelle Objekt zurückgegeben hättest, wäre das kein Problem.



  • was hat das jetzt mit dem BCB zu tun ?
    Hat der BCB diesbezüglich eine Abweichung vom Standard ?



  • drösig schrieb:

    was hat das jetzt mit dem BCB zu tun ?
    Hat der BCB diesbezüglich eine Abweichung vom Standard ?

    Nö.



  • 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