Container mit Oberklasse Zeigern



  • Sers!

    Wenn ich folgende Klassen habe:

    class A { };
    class B : public A { };
    
    class Container {
    public:
       virtual ??? getAContainer() = 0;
    };
    
    class ContainerDerived : public Container {
    
    public:
       std::map<std::string, B*> mBMap;
    
       virtual ??? getAContainer() {
           return mBMap; ??
       }
    
    };
    

    Im ContainerDerived habe ich also eine Map mit B Zeigern. Jedes B ist ja ein A. In der Superklasse Container brauch ich jetzt Zugriff auf die ganzen B, allerdings über die A Schnittstelle (Container kennt nur A!).

    Also Container soll Zugriff auf eine map mit A Zeigern kriegen. Wie könnte man das machen?



  • Deine Basisklasse soll auf Membervariablen einer von ihr abgeleiteten Klasse zugreifen? Das geht nicht.

    Du könntest höchsten in Container A-Zeiger speichern und die im getter von ContainerDerived versuchen dynamisch runterzucasten.

    Jenachdem, was du vor hast, musst du dafür aber nicht direkt den Container ableiten, weils ne andere Memberfunktion da auch täte.

    Kannst du erklären, warum du das willst? Vielleicht lässt sich dann ja eine elegantere Lösung finden.



  • ...sieht nach dinem Fehl-Design aus...



  • krümelkacker schrieb:

    ...sieht nach dinem Fehl-Design aus...

    Danke für diesen nutzlosen Kommentar.

    Hier wird schnell mit dem Fehl-Design!!!!11 Hammer geschwungen. 🙄



  • Nutzlos fand ich Krümelkackers Kommentar nicht. Weil ich ähnliches vermutet hatte, habe ich ja die entsprechende Frage gestellt.

    (Nicht Jammern, sondern nur mal kurz drüber nachdenken, ob er Recht haben könnte. ;))



  • Kobiashwili schrieb:

    Also Container soll Zugriff auf eine map mit A Zeigern kriegen. Wie könnte man das machen?

    C++ unterstützt kovariante Return-Typen:

    class A {};
    class B : public A {};
    
    class Container
    {
    public:
       virtual A* get(const std::string& name) = 0;
    };
    
    class ContainerDerived : public Container 
    {
    private:
      std::map<std::string, B*> mBMap;
    public:
      virtual B* get(const std::string& name)
      {
        ...
      }
    };
    


  • ups... Das wolltest du wohl nicht...


Anmelden zum Antworten