Probleme mit Copy-Konstruktor einer abgeleiteten Klasse.



  • Hallo Leute,

    ich habe ein Problem mit einem Copy-Konstruktor in einer abgeleiteten Klasse.

    Die Basisklasse sieht folgendermaßen aus:

    enum TYPE { empty, blocked, taken };
    
    class Cell_t {
    
        public:
            Cell_t(TYPE,
                   unsigned short int,
                   unsigned short int);
            Cell_t(const Cell_t &);
    
        ...
    }
    

    Und der Copy-Konstruktor sieht so aus:

    Cell_t::Cell_t(TYPE type,
        unsigned short int posX,
        unsigned short int posY) {
    
        itsType = type;
        itsPosX = posX;
        itsPosY = posY;
    }
    

    Die Basisklasse funktioniert gut aber die abgeleitete Klasse die folgendermaßen aussieht...

    class TakenCell_t : public Cell_t {
    
        public:
            TakenCell_t(unsigned short int,
            unsigned short int,
            std::string,
            unsigned short int,
            unsigned short int,
            unsigned short int,
            unsigned short int);
            Cell_t(const Cell_t &);
        ...
    }
    

    macht mir Probleme. Und zwar stellt sich mir die Frage wie der Copy-Konstruktor aussehen soll? Mein erster Versuch ging natürlich in die Hose:

    TakenCell_t::TakenCell_t(const TakenCell_t &rhs):
    Cell_t::Cell_t(const Cell_t &rhs) {
    
        itsText = rhs.GetText();
        itsColSpan = rhs.GetColSpan();
        itsRowSpan = rhs.GetRowSpan();
        itsWidth = rhs.GetWidth();
        itsHeight = rhs.GetHeight();
    }
    

    Kann wer weiterhelfen?

    Danke
    Goran



  • Hallo Goran,

    Dein Copy-Konstruktor von TakenCell_t muss so aussehen:

    class TakenCell_t : public Cell_t 
    {
    public:
        TakenCell_t( ... );
        TakenCell_t( const TakenCell_t & b );
        // Cell_t(const Cell_t &);  <== das ist hier falsch
    
        std::string itsText;
        // usw.
    };
    
    TakenCell_t::TakenCell_t( const TakenCell_t& b )
        : Cell_t( b )
        , itsText( b.itsText )
        // weiter Member initialisieren
    {}
    

    benutzte Initialisierungslisten, das ist schneller, einfacher und sieht aufgeräumt aus.

    Weiter wäre zu überlegen, ob Du überhaupt einen Copy-Konstruktor brauchst. Solange eine Klasse nur int, short, std::string und ähnliches als Member hat, die einfach nur kopiert werden müssen, würde ich den Copy-Konstruktor immer weglassen; er wird dann vom Compiler automatisch (und korrekt) erzeugt.

    .. und vergiss das ';' hinter der Klassendefinition nicht.

    Gruß
    Werner


Log in to reply