Basisklasse Kopierkonstruktor



  • Hallo,

    ich find im Netz nicht so recht die Info,

    wenn ich tiefe Kopien für meine Basisklasse brauche,
    für meine abgeleiteten Klassen aber eigentlich nicht mehr(bezüglich
    ihrer zusätzlichen member), kann man dann irgendwie diese tiefen Kopien
    durch den Kopierkonstruktor auf der Basisklassenebene so erzeugen,
    dass ich diese sie nicht jedesmal für abgeleiteten Klassen
    neu durchführen muss...

    Danke für die Antwort

    Rahul



  • Wenn du einen Kopierkonstruktor für deine abgeleitete Klase schreibst, kannst du selber entscheiden was der macht. Wenn du wirklich der Meinung bist, dort keine Kopie des Basis-Anteils zu benötigen, kannst du dort auch einen anderen Basis-Konstruktor verwenden.

    (nur am Rande: Wozu benötigst du das eigentlich?)



  • Hm, hat man mich doch falsch verstanden so ganz ohne Beispiel,
    also gut mit Beispiel

    Ich habe mir eine Klasse zum Zeichnen einfacher OpenGL Formen erstellt.

    class GL3DShapeADT
    	{
    	public:
    
    		// ***** constructors  ***** 
    		GL3DShapeADT(const QColor  & surfaceColour, const QVector3D  & centre);
    		GL3DShapeADT(const GL3DShapeADT & rhs);
    		virtual ~GL3DShapeADT();
    
    ...
    	protected:
    		// ***** members *****
    		QVector<GL3DShapeADT *>  m_glSubShapes;
    
    		QVector<QVector3D>       m_vertices;
    		QVector<QVector3D>       m_normals;
    		QVector<GLushort>        m_faceVertIndices;
    
    		QMatrix4x4               m_transformationInWorld;
    		QVector3D                m_centre;
    		GLfloat                  m_surfaceColour[4];
    
    	}; // class
    

    Alle Shapes haben Vertices, Normalen und Indizes für die Flächen.
    Die Formen können aber auch Subformen(m_glSubShapes) haben, um auf einfache Weise wiederzuverwenden, was schon mal erstellt wurde
    (Die OpenGL Arrays sind ja mühselig handzuhaben). So ist z.B im Moment die Halbkugel eine Subform,
    die ich schön wiederverwenden kann, zum einen für die Kugel, zum anderen
    für eine Zylinder mit abgerundeten Enden...

    Wenn ich eine abgeleitete Shape kopiere, benötigen prinzipiell nur die "m_glSubShapes" tiefe Kopien. Ich fände es da aus Convenience-Gründen besser, aber auch für einen fremden Programmierer, oder mich in ein paar Monaten
    vielleicht sicherer, wenn er nicht jedes mal den Kopierkonstruktor für die abgeleiteten Klassen überschreiben müsste, sondern das auf irgendeine Weise inherent von der Basisklasse erledigt wird, halt ohne dass ich noch was an der
    abgeleiteten Klasse herumschrauben muss. Ich hoffe, ich habe mich verständlich genug ausgedrückt...

    Vielen Dank
    Rahul



  • Rahul0891 schrieb:

    kann man dann irgendwie diese tiefen Kopien
    durch den Kopierkonstruktor auf der Basisklassenebene so erzeugen,
    dass ich diese sie nicht jedesmal für abgeleiteten Klassen
    neu durchführen muss...

    Meinst Du so etwas:

    class Base
    {
        public:
            ...
            Base(const Base &src); //Kopierkonstruktor Basisklasse
            ...
    };
    
    class Derived : public Base
    {
        public:
            ...
            Derived(const Derived &src);
            ...
    };
    
    Derived::Derived(const Derived &src) : Base(src) //Kopierkonstruktor Basisklasse aufrufen
    {
        ...
    }
    


  • Jo danke,
    stand ein wenig sehr auf dem Schlauch, das der einmal definierte Kopierkonstruktor automatisch vom Compiler für die abgeleitete Klasse eingebaut wird.

    Dann noch einmal danke für die Antwort


Log in to reply