Frage zu copykonstruktor



  • Nun ich habe folgendes eine classe Cartoon. Und daraus habe ich eine andere classe gezogen bird und cat. Also ist cat und bird eine superclasse von cartoon. Nun kann ich irgend wie copykonstruktor von class Cartoon benutzen in der classe bird, und cat und die irgend wie erweitern oder sollte ich sie neu schreiben?. Nun ich habe die neue geschrieben bekomme ich irgend wie fehlen oder ist das schon in Ordnung?



  • ???



  • Master User schrieb:

    Nun ich habe folgendes eine classe Cartoon. Und daraus habe ich eine andere classe gezogen bird und cat. Also ist cat und bird eine superclasse von cartoon. Nun kann ich irgend wie copykonstruktor von class Cartoon benutzen in der classe bird, und cat und die irgend wie erweitern oder sollte ich sie neu schreiben?. Nun ich habe die neue geschrieben bekomme ich irgend wie fehlen oder ist das schon in Ordnung?

    First of all: Es ist unheimlich schwer, deinen Text zu verstehen. Les dir die
    Saetze nochmal _ganz_ genau durch.

    Was heisst 'gezogen'? Erbt bird und cat von cartoon? Wenn dem so ist, brauchst du
    fuer bird und cat einen eigenen cp-Ctor, denn der cartoon-cp-Ctor hat ja gar keine
    Ahnung davon, wie er ein 'bird' oder ein 'cat' kopieren soll.

    mfg
    v R



  • wenn cat und bird vererbt sind, warum dann superklasse?

    der text ist wirklich schwer verständlich...



  • Und daraus habe ich eine andere classe gezogen bird und cat. Also ist cat und bird eine superclasse von cartoon.

    Das ist ein Widerspruch. Du meinst wohl, dass Bird und Cat Subklasse sind. Nebenbei ist deine Vererbungshierarchie nicht wirklich logisch. Seit wann IST eine Katze ein Cartoon? 😉

    Ich hab zwar nicht ganz verstanden was du jetzt eigentlich willst, aber:

    1. Konstruktoren werden nie mitvererbt
    2. Du kannst den Konstruktor der Basisklasse durch Basisklasse::Basisklasse() aufrufen


    1. Konstruktoren werden nie mitvererbt
    2. Du kannst den Konstruktor der Basisklasse durch Basisklasse::Basisklasse() aufrufen

    Was soll dass denn heißen?

    Also der Konstruktor des Derivats ruft immer den Standard-C'tor der Basisklasse auf. Will man einen anderen muss man das explizit in der Initialisierungsliste angeben.

    Basisklasse::Basisklasse()
    

    😕
    Totaler Käse.



  • Helium schrieb:

    1. Konstruktoren werden nie mitvererbt
    2. Du kannst den Konstruktor der Basisklasse durch Basisklasse::Basisklasse() aufrufen

    Was soll dass denn heißen?

    Wenn du das nicht verstehst, ist das nicht mein Problem.

    Also der Konstruktor des Derivats ruft immer den Standard-C'tor der Basisklasse auf. Will man einen anderen muss man das explizit in der Initialisierungsliste angeben.

    Das steht in keinem Widerspruch zu meinen Aussagen.

    Basisklasse::Basisklasse()
    

    😕
    Totaler Käse.[/quote]
    Achja?
    Dann compilier das mal:

    #include <iostream>
    using namespace std;
    
    class A{
    public:
       A() {  }
       A(const A& a) { cout << "Copy-A" << endl; }
    };
    
    class B: public A {
    public:
       B() {  }
       B(const B& b) { A::A(b); cout << "Copy-B"; }
    };
    
    int main() {
       B b;
       B b2(b);
    
       return 0;
    }
    


  • interpreter schrieb:

    B(const B& b) { A::A(b); cout << "Copy-B"; }
    

    Da wird ein temporäres Objekt vom Typ A als Kopie (Slice in dem Fall) von b erzeugt(*). Den Basisklassenkonstruktor ruft man grundsätzlich per Initialisiererliste auf. C++ != Java.

    (*) Edit: Oops, Käse erzählt. Es ist noch viel schlimmer. Das wird als Deklaration interpretiert. Im Einzelnen:

    1. Jede Klasse hat sich selbst in ihrem Scope, d.h. A::A == A (logischerweise dann auch A::A::A::A...)
    2. A(b) wird dann als Deklaration interpretiert, da ein Deklarator syntaktisch eingeklammert sein darf und Deklarationen immer Vorrang haben.


  • ja so mache ich es beim konstruktor und dekonstruktor, aber beim kopierkonstruktor bekomme ich kompilierfehler. Aber nur beim Kopierkonstruktor.

    error C2512: 'Cartoon' : no appropriate default constructor available

    aber e funktioniert wie ich schon sagte bei konstruktor und dekonstruktor. Schon komisch nicht?.

    Ich habe es auch so verucht
    SuperKlasse(const SuperKlasse &Copy):Basisklasse(const Basisklasse &Copy)
    {
    //irgetwas
    }

    und das habe ich versucht, aber geht auch nicht

    SuperKlasse(const SuperKlasse &Copy)
    {
    ::Basisklasse(const Basisklasse &Copy)
    //irgetwas

    }

    wobei ich hier mehr fehler bekomme obwohl das eine wariante von
    Basisklasse::Basisklasse() ist.



  • Master User schrieb:

    Ich habe es auch so verucht
    SuperKlasse(const SuperKlasse &Copy):Basisklasse(const Basisklasse &Copy)
    {
    //irgetwas
    }

    Kann es sein, dass dir die Begriffe Superklasse und Basisklasse noch nicht ganz geläufig sind? Denn dieses Stück Source macht keinen Sinn.

    error C2512: 'Cartoon' : no appropriate default constructor available
    

    Vermutlich hast du in deiner Basisklasse den Copykonstruktur implementiert, den Defaultkonstruktor jedoch nicht. In deiner Subklasse wird nun vermutlich implizit der Standardkonstruktor der Basisklasse aufgerufen (da du wahrscheinlich in der Initialisierungsliste nicht explizit einen definierten Konstruktor aufrufst), den es jedoch nicht gibt (wenn du irgend einen Konstruktor definiert, wird der sonst verfügbare leere Standardkonstruktor NICHT mehr erzeugt).


Anmelden zum Antworten