Использование make_shared с защищенным конструктором + абстрактный интерфейс
Учитывая абстрактный интерфейс и реализацию, производную от этого интерфейса, где конструкторы защищены (создание этих объектов доступно только из фабрики классов - для реализации шаблона DI), как я могу использовать make_shared в функции фабрики?
Например:
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, очевидно, не может получить доступ к защищенному конструктору в InterfaceImpl или даже в IInterface, что выдает мне следующую ошибку
error C2248: 'InterfaceImpl::InterfaceImpl' : cannot access protected member declared in class 'InterfaceImpl'
Так что читайте здесь (вопрос:Как сделать буст :: make_shared друг моего класса), Я попытался поместить следующее в класс реализации:
friend std::shared_ptr<InterfaceImpl> std::make_shared<InterfaceImpl>();
Это все еще не скомпилируется. Тогда я добавлю еще один в класс IInterface. Все еще нет радости. Что я здесь не так сделал?
РЕДАКТИРОВАТЬ: полный исходный файл, используемый для компиляции, с "другом" ...
#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();
}