Aufruf von Derived Klassen von einer Basisklasse?



  • Hallo,

    mir ist bewusst, dass die Frage grundsätzlich das Resultat eines schlechten Gesamtdesigns ist. Aber aus Gründen, hat die Frage Berechtigung.

    Ich möchte von einer Basisklasse aus, (die wiederum eigentlich auch eine abgeleitete Klasse ist), je nach Anforderung verschiedene abgeleitete Klassen aufrufen.. Ich möchte aber verhindern, dass bei jeder Prüfung ständig alle Konstruktoren neu aufgerufen werden.

    //Basisklasse Base
    wenn typ1 dann Aufruf derived ClassA
    wenn typ2 dann Aufruf derived ClassB
    

    Etwa so sieht das aus:

    
    class Base {
    public:
     
    };
    
    class Handler : public Base {
    public:
     virtual void process() = 0;
    };
    
    class ClassA : public Handler {
    public:
     std::unique_ptr<Handler> createDerived(type) override {
       return std::make_unique<ClassA>();
     }
     
     void process() override {
       // Implementierung der Methode process()
     }
    };
    
    
    

    Ich dache zunächst an eine Lösung in dieser Art, aber wegen der vielen Ableitungen gibts Fehler beim Kopieren:

    
    class Base {
    private:
      static std::unordered_map<types, std::unique_ptr<Handler>> m_instances;
    
    public:
      
    };
    
    // Initialization outside the class 
    std::unordered_map<types, std::unique_ptr<Handler>> Base::m_instances = {
      { type, std::make_unique<ClassA>() },
    
    
    

    Hat jemand eine Lösung für das Problem oder einen Tipp?


  • Mod

    Hat jemand eine Lösung für das Problem oder einen Tipp?

    Was ist denn das Problem? Du beschreibst ja nur, wie du dir einen schlechten Lösungsweg vorstellst, auf dem du nicht voran kommst. Siehe XY-Problem.

    Wieso wird dein ominöses Problem nicht durch virtuelle Funktionen gelöst, die dir ja offensichtlich ein Begriff sind?



  • Sorry, ich habe mich offenbar unklar ausgedrückt.

    Ich möchte so etwas machen:

    
    //Base::foo()
    wenn typ1
    return std::make_unique<ClassA>();
    wenn typ2 
    return std::make_unique<ClassB>();
    
    returnpointer->process();
    

    ober ohne, dass jedesmal alle Konstruktoren neu aufgerufen werden.
    Die Frage ist also: wie kann ich die Derived-Instanzen erzeugen und von Base aufrufen, ohne dass jedesmal eine neue Instanz erzeugt wird?

    Im Vorfeld in Base schon alle Derived-Instanzen in einen Container abzulegen hat nicht funktioniert.


  • Mod

    @TauCeti sagte in Aufruf von Derived Klassen von einer Basisklasse?:

    Im Vorfeld in Base schon alle Derived-Instanzen in einen Container abzulegen hat nicht funktioniert.

    So, so. Nicht funktioniert. Dann ist doch klar, wo das Problem liegt.

    Unabhängig davon, hast du offensichtlich fundamentale Designprobleme, was eine Klasse überhaupt ist, und welche Rolle diese im Datenmodell eines Programms spielen. Da liegt dein wahres Problem. Du scheinst sie eher wie Namespaces zu benutzen. Eigentlich dürfte es nie Unklarheiten darüber geben, wer ein Objekt wo und wie lange für welchen Zweck erzeugt. Denn das beantwortet sich alles automatisch durch das, was die Klasse darstellt. Dass das bei dir unklar ist, ist dein wahres Problem und da liegt die wahre Lösung.


Anmelden zum Antworten