Учитывая абстрактный интерфейс и реализацию, производную от этого интерфейса, где конструкторы защищены (создание этих объектов доступно только из фабрики классов - для реализации шаблона 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'
Итак, читая здесь (вопрос: Как сделать boost :: 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();
}