Verwenden von make_shared mit einem geschützten Konstruktor + abstrakter Schnittstelle

Wie kann ich make_shared in der Factory-Funktion verwenden, wenn eine abstrakte Schnittstelle und eine von dieser Schnittstelle abgeleitete Implementierung vorhanden sind, bei der Konstruktoren geschützt sind (die Erstellung dieser Objekte ist nur in einer Klassenfactory möglich - um ein DI-Muster zu implementieren)?

Beispielsweise

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 in IInterface zugreifen und gibt mir den folgenden Fehler:


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

Also hier lesen (Frage:Wie mache ich Boost :: make_shared ein Freund meiner Klasse) Habe ich versucht, Folgendes in die Implementierungsklasse zu setzen:


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

Es würde immer noch nicht kompilieren. Also habe ich noch einen in die IInterface-Klasse aufgenommen. Immer noch keine Freude. Was habe ich hier falsch gemacht?

EDIT: Vollständige Quelldatei zum Kompilieren mit "friend" ...

#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();   
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage