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