给定一个抽象接口和一个从该接口派生的实现,其中构造函数受到保护(这些对象的创建只能从类工厂获得 - 以实现 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();
}