【发布时间】:2012-10-29 23:31:06
【问题描述】:
我将省略相当多的代码,因为这些是一些相当大的对象,我的问题实际上只是关于 std::make_shared 的操作。我在命名空间 SYNC 中有一个名为 D3D11Shader 的对象。这有一个名为 static 的函数,
SYNC::D3D11Shader * SYNC::D3D11Shader::CreateInstance(const std::string & s)
它将采用字符串索引并返回指向从 SYNC::D3D11Shader 派生的着色器实例的指针。有一次,我开始使用智能指针在包含所有这些着色器的向量中自动释放这些指针。但是,当我这样做时,
std::shared_ptr<SYNC::D3D11Shader> shaderPtr;
// ... verification of index and other initialization happens here
// so i am unable to initialize it in it's constructor
shaderPtr = std::make_shared<SYNC::D3D11Shader>(SYNC::D3D11Shader::CreateShader(shaderName));
编译器错误说我试图在这一行中实例化 D3D11Shader 的一个实例,这是一个抽象类。我认为 make_shared 所做的只是返回 std::shared_ptr 的一个实例。 CreateInstance 函数从不尝试创建此类的实例,只是派生和实现它的对象。在使用此函数和智能指针之前,我没有收到此错误。有谁知道这里发生了什么?
【问题讨论】:
-
好吧,定义中的关键短语是“构造一个对象”。有没有办法在初始化后简单地将 shared_ptr 设置为指针?
-
直接使用shared_ptr的构造函数
shared_ptr<SYNC::D3D11Shader> ptr(your_pointer_here);,或者ptr.reset(your_pointer_here);,如果你有一个现有的。 -
我认为最好的解决方案是重写
CreateInstance的接口以返回共享指针。然后你可以在 that 代码中使用make_shared。