Rückgabewerte überschreiben vs. smart pointer



  • Ich würde gerne folgendes umsetzen:

    class A {...};
    
    class B : public A {...};
    
    class Interface {
    public:
    	virtual A* get() = 0;
    };
    
    class Impl : public Interface {
    public:
    	virtual B* get();
    };
    

    Das compiliert und funktioniert so wie es soll.
    Sobald ich aber smart pointer verwende, klappt das (logischerweise) nicht mehr.

    Gibt es einen Trick o.ä. das zu umgehen?

    Das hier funktioniert nicht (da Rückgabewerte objekte und keine Pointer sind):

    class A {...};
    
    class B : public A {...};
    
    class Interface {
    public:
    	virtual shared_ptr<A> get() = 0;
    };
    
    class Impl : public Interface {
    public:
    	virtual shared_ptr<B> get();
    };
    

  • Administrator

    crt32 schrieb:

    Gibt es einen Trick o.ä. das zu umgehen?

    Ja:

    class A {...};
    
    class B : public A {...};
    
    class Interface
    {
    private:
        virtual A* getInstance() = 0;
    
    public:
        shared_ptr<A> get()
        {
            return shared_ptr<A>(getInstance());
        }
    };
    
    class Impl : public Interface
    {
    private:
        virtual B* getInstance();
    
    public:
        shared_ptr<B> get()
        {
            return shared_ptr<B>(getInstance());
        }
    };
    

    Es ist sowieso immer eine gute Idee, die richtig virtuellen Funktion privat zu halten und nach aussen nur nicht virtuelle Funktionen als Schnittstelle anzubieten, welche allenfalls auf die privaten virtuellen Funktionen zugreifen.

    Grüssli


Anmelden zum Antworten