Usando make_shared com um construtor protegido + interface abstrata
Dada uma interface abstrata e uma implementação derivada dessa interface, na qual os construtores são protegidos (a criação desses objetos está disponível apenas em uma fábrica de classes - para implementar um padrão DI), como posso usar o make_shared na função factory?
Por exemplo:
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;
}
O make_shared obviamente não pode acessar o construtor protegido no InterfaceImpl ou mesmo no IInterface, dando-me o seguinte erro
error C2248: 'InterfaceImpl::InterfaceImpl' : cannot access protected member declared in class 'InterfaceImpl'
Então, lendo aqui (pergunta:Como tornar o boost :: make_shared um amigo da minha turma), Tentei colocar o seguinte na classe de implementação:
friend std::shared_ptr<InterfaceImpl> std::make_shared<InterfaceImpl>();
Ainda não seria compilado. Então, eu coloquei outro na classe IInterface também. Ainda sem alegria. O que eu fiz de errado aqui?
EDIT: arquivo de origem completo usado para compilar, com "amigo" ...
#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();
}