假设有一个抽象接口和一个从该接口派生的实现,其中构造函数是受保护的(只能通过类工厂创建这些对象 - 以实现 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类中添加了另一个。仍然没有成功。我在这里做错了什么?
编辑:使用“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();
}
make_shared()
交朋友,GCC就没有问题。 - Georg Fritzsche