Kopierkonstruktor HowTo



  • wahrscheinlich ist deine Methode get_attribute () nicht const?!
    btw initialisierungsliste:

    MyClass::MyClass(const MyClass &rhs)
      : m_eins (rhs.m_eins), m_zwei (rhs.GetBla ()), m_drei (4) /*, ...*/
      {
       //ist bei mir meist leer, weil man fast alles in der initialisierungsliste machen kann
      }
    


  • pktm schrieb:

    Hallo!

    Wenn ich mir den Kopierkonstruktor so definiere:

    Mach das einfach so:

    // MyClass.h
    MyClass(MyClass const& rhs);
    
    // MyClass.cpp
    MyClass::MyClass(MyClass const& rhs) : attribute (rhs.attribute) {
    }
    


  • Braunstein schrieb:

    Ist denn get_attribute() const ? Das sollte sie schon sein.
    Wozu hier überhaupt eine Zugriffsfunktion?

    Hm nein, ist sie nicht. Macht es denn Sinn? Es ist eine Getter-Methode auf ein Attribut. Wozu macht man Methoden const?



  • ~john schrieb:

    pktm schrieb:

    Hallo!

    Wenn ich mir den Kopierkonstruktor so definiere:

    Mach das einfach so:

    // MyClass.h
    MyClass(MyClass const& rhs);
    
    // MyClass.cpp
    MyClass::MyClass(MyClass const& rhs) : attribute (rhs.attribute) {
    }
    

    Ja, hörrt sich gut an.
    Kann ich denn einfach so auf private Atrribute zugreifen?
    *ausprobiergeh* => jepp 🙂



  • pktm schrieb:

    Braunstein schrieb:

    Ist denn get_attribute() const ? Das sollte sie schon sein.
    Wozu hier überhaupt eine Zugriffsfunktion?

    Hm nein, ist sie nicht. Macht es denn Sinn? Es ist eine Getter-Methode auf ein Attribut. Wozu macht man Methoden const?

    Eine const Methode zeigt an, daß das Objekt nicht verändert wird(werden kann). Ein Getter ändert grundsätzlich nicht den Wert eines Objekts, daher ist es sinnvoll diesen const zu definieren.


  • Mod

    Falls der Copy-ctor am Ende so aussieht:

    MyClass::MyClass(MyClass const& rhs) : x(rhs.x),y(rhs.y),z(rhs.z){}
    

    können wir auf die Definition eines eigenen Konstruktors gleich verzichten.



  • const bei Methoden führt dazu, dass die Methode keine Änderungen an der Klasse durchführen kann. Dies ist bei GetXY()-Methoden sinnvoll.

    Konstante Methoden haben folgende Syntax (merke dir, const nach dem Funktionsnamen zu schreiben):

    int GetInt() const;
    

    Edit: war schon jemand schneller 🙂
    Edit2: Semikolon vergessen *grr*



  • camper schrieb:

    Falls der Copy-ctor am Ende so aussieht:

    MyClass::MyClass(MyClass const& rhs) : x(rhs.x),y(rhs.y),z(rhs.z){}
    

    können wir auf die Definition eines eigenen Konstruktors gleich verzichten.

    Ah, danke für das mit dem const.

    Wieso kann ich gleich auf den Konstruktor verzeichten? Gibts den per default?



  • Ja.



  • Ja, wenn du keinen eigenen schreibst, wird vom Compiler ein Kopierkonstruktor erzeugt. Manchmal ist es allerdings sinnvoll, einen spezifischen zu implementieren, z.B. wenn Zeiger im Spiel sind, oder wenn bei der Kopie eines Objektes noch etwas Spezielles passieren soll.



  • pktm schrieb:

    Ja, hörrt sich gut an.
    Kann ich denn einfach so auf private Atrribute zugreifen?
    *ausprobiergeh* => jepp 🙂

    Innerhalb der Klasse selbst kannst Du immer auf alle Attribute zugreifen. Auf Attribute der Elternklasse nur dann wenn sie protected oder public sind, aus anderen Klasse nur, wenn sie public sind. Ergänzend geht es noch, wenn eine Funktion, Methode oder Klasse als friend deklariert wurde.

    Die Initialisierung via Getter Methode ist nur unter ganz bestimmten Fällen sinnvoll, und dann muß sie hierfür const deklariert sein.

    // .h
    MClass {
        int attribute;
    public:
        MyClass();
        MyClass(MyClass const& rhs);
        int get_attribute() const; // Konstante Methode
    };
    
    // .cc
    MyClass::MyClass (MyClass const& rhs) : attribute (rhs.get_attribute()) {}
    

Anmelden zum Antworten