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<IInterface> Create();
virtual void Method() = 0;
};
class InterfaceImpl : public IInterface
{
public:
virtual void Method() {}
protected:
friend std::shared_ptr<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();
}