給定一個抽象的接口,並從該接口,在構造函數是保護衍生的實現(這些對象的創建僅是從一個類工廠 - 實現DI模式),如何能我在工廠函數中使用make_shared?使用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'
所以在這裏讀(問題:How to make boost::make_shared a friend of my class)我試圖把下面進入實施類:
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();
}
我想這就是VC10?只要你和'make_shared()'交朋友,GCC btw就沒有問題。 – 2010-08-22 13:48:40
它是VS2010,它實際上給出了一個警告(錯誤 - 詳細在這裏:http://connect.microsoft。COM/VisualStudio中/反饋/信息/ 321690/C-VC9-虛假警告-c4396換有效的代碼)。 – Robinson 2010-08-22 13:49:13