Anzeige:
Ergebnis 1 bis 3 von 3

Thema: C++ Vererbung, const& member

  1. #1
    Registrierter Benutzer
    Registriert seit
    13.09.2010
    Beiträge
    1

    C++ Vererbung, const& member

    Hallo.

    Ich muss etwas legacy Code um neue Klassen ergänzen. DataA und ContainerA sind gegeben, DataB und ContainerB müsser aus diesen abgeleitet werden. Die Idee ist im Code unten veranschaulicht. Natürlich ist es nicht kompilierbar, weil die Elternklasse einen const& Member enthält (die Tochterklasse tut es ebenfalls). Ist eine solche Vererbung überhaupt machbar ohne die Elternklassen zu manipulieren?
    PS: vector und queue sind nur Beispiele, in Wirklichkeit sieht's etwas komplizierter aus.

    Code:
     
    #include <vector>
    #include <queue>
    
    class DataA
    {
      std::vector<int> dataA;
      virtual void processData();
    public:
      DataA() { dataA.push_back(0); }
    };
    
    class DataB : public DataA
    {
      std::queue<int> dataB; 
      virtual void processData();
    public:
      DataB() {dataB.push(0);}
    };
    
    
    class ContainerA
    {
      DataA const& dA; 
    public:
      ContainerA(DataA const& d) : dA(d) {}
    };
    
    class ContainerB : public ContainerA
    {
      DataB const& dB; 
    public: 
      ContainerB(DataB const& d) : dB(d) {}
    };
    
    int main()
    {
      DataB db; 
      ContainerB cb(db);
    }
    Geändert von volatile (13-09-2013 um 12:36 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Natürlich ist es nicht kompilierbar, weil die Elternklasse einen const& Member enthält (die Tochterklasse tut es ebenfalls).
    Das verstehe ich nicht. Dein Code kompiliert nicht, weil du in "ContainerB" versuchst den Default-Constructor von "ContainerA" aufzurufen, welcher aber als gesperrt definiert ist ("is defined as deleted"). Rufe stattdessen den sebstdefinierten Konstruktor von ContainerA auf, und dein Code wird auch kompilieren.

    Evtl. gibt es für dein eigentliches Programmierproblem ja noch eine einfachere Lösung. Wenn du erläuterst, wo das eigentliche Problem liegt, dann könnten vielleicht noch bessere Kommentare folgen.

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Code:
    ContainerB(DataB const& d) : ContainerA(d), dB(d) {}
    Beide Basisklassen sollten entweder den Destructor protected deklarieren oder virtual.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •