Kopierkonstruktor in abgeleiter Klasse...



  • Hi Leute, bin gerade am verzweifeln und hoffe das mir jemand helfen kann.

    Ich hab eine Basisklasse mit 2 private Komponenten x und y
    In der abgeleiteten klasse habe ich 2 weitere private Komponenten x2 und y2.
    Funktioniert soweit auch alles prima, nur wenn ich nun nen Kopierkonstruktor für die abgeleitete Klasse (kein vom compiler generierter copyconstructor) schreiben will kann ich net auf die Komponenten der Basisklasse zugreifen.

    Hier nen paar schnippsel aus dem Code:

    Basisklasse

    class C2dPoint {
        public: 
    ...
        private:
          double    x;
          double    y;
    }
    

    Abgeleitete Klasse

    class C2dLine : public C2dPoint {
        public:
    ...
          C2dLine(const C2dLine& secondline)  // copy-constructor
    ...
          C2dLine& copy (const C2dLine &source );  // memberfunction copy
    ...
        private:
          double  x2;
          double  y2;
    }
    

    copy-constructor und memberfunction copy

    C2dLine::C2dLine(const C2dLine& secondline) {
          cout << endl << "Ich bin der Kopiekonstruktor von C2dLine" << endl;
      	this->copy(secondline);
    }
    
    C2dLine& C2dLine :: copy( const C2dLine &source) {
        cout << endl << "Ich bin die copy-Funcktion von C2dLine" << endl;
        if (this!=&source) {
    	      setX(source.getX());    // geht nicht!!
        		setY(source.getY());    // geht nicht!!
        		x2 = source.x2;         // FUNKTIONIERT!!!
        		y2 = source.y2;         // FUNKTIONIERT!!!
        }
        return *this;
    }
    


  • Also ich bin eigentlich hauptsächlich Java-Entwickler, daher entschuldige bitte meine nur sehr geringe Kompetenz in C++. Aber ich würde sagen die Datenelemente in deiner Basisklasse dürfen nicht private sein, da sie sonst wirklich nur von dieser Klasse genutz werden können. Wenn das in C++ nicht komplett anders ist, dann musst du die Datenelemente in deiner Basisklasse mit dem modifier "protected" versehen.

    Ich hoffe, ich konnte helfen.
    Gruß,
    Flo



  • Sehe nicht, warum das nicht funktionieren sollte. Die Frage ist, warum rufst Du nicht einfach den Basis-Klassen-Konstruktor auf?

    C2dLine::C2dLine(const C2dLine& secondline) : C2dPoint(secondline) {
          cout << endl << "Ich bin der Kopiekonstruktor von C2dLine" << endl;
          this->copy(secondline);
    }
    

    Nebenbei bemerkt solltest Du vielleicht Deinen Entwurf überdenken. public-Vererbung bedeutet "ist ein". Angewendet auf Deine Klassen heißt das: Eine Linie "ist ein" Punkt. Daß das nicht stimmt dürfte klar sein. Und das ist zumeist ein gutes Indiz dafür, daß die Vererbungshierarchie ungeschickt ist.

    MfG Jester


Anmelden zum Antworten