5 Stimmen

Verwendung von make_shared mit einem geschützten Konstruktor + abstrakte Schnittstelle

Angesichts einer abstrakten Schnittstelle und einer von dieser Schnittstelle abgeleiteten Implementierung, bei der die Konstruktoren geschützt sind (die Erstellung dieser Objekte ist nur über eine Klassenfabrik möglich - um ein DI-Muster zu implementieren), wie kann ich make_shared in der Fabrikfunktion verwenden?

Zum Beispiel:

class IInterface
{    
public:    
    virtual void Method() = 0;
};

class InterfaceImpl : public IInterface
{
public:
    virtual void Method() {}

protected:    
    InterfaceImpl() {}    
};

std::shared_ptr<IInterface> Create()
{
    std::shared_ptr<IInterface> object = std:: make_shared<InterfaceImpl>();    
    return object;
}

make_shared kann offensichtlich nicht auf den geschützten Konstruktor in InterfaceImpl oder sogar in IInterface zugreifen und gibt mir folgende Fehlermeldung

error C2248: 'InterfaceImpl::InterfaceImpl' : cannot access protected member declared in class 'InterfaceImpl'

So lesen hier (Frage: Wie man boost::make_shared zu einem Freund meiner Klasse macht ), habe ich versucht, das Folgende in die Implementierungsklasse einzufügen:

friend std::shared_ptr<InterfaceImpl> std::make_shared<InterfaceImpl>();

Es ließ sich trotzdem nicht kompilieren. Also fügte ich eine weitere in die IInterface-Klasse ein. Immer noch keine Freude. Was habe ich hier falsch gemacht?

EDIT: Vollständige Quelldatei zum Kompilieren verwendet, mit "Freund"...

#include <memory>

class IInterface
{    
public:    
    friend std::shared_ptr&lt;IInterface> Create();     
    virtual void Method() = 0;
};

class InterfaceImpl : public IInterface
{    
public:     
    virtual void Method() {}

protected:    
    friend std::shared_ptr&lt;IInterface> Create();     
    InterfaceImpl() {}    
};

std::shared_ptr<IInterface> Create()
{
    std::shared_ptr<IInterface> object = std::make_shared<InterfaceImpl>();    
    return object;
}

void main()
{
    std::shared_ptr<IInterface> i = Create();   
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X