使用std :: make_shared抽象类实例化的错误
error using std::make_shared abstract class instantiation
我将省略大量代码,因为这些代码是一些相当大的对象,而我的问题实际上只是涉及std :: make_shared的操作。我有一个名为D3D11Shader的命名空间同步中的对象。这具有静态函数,
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的实例,这是一个抽象类。我以为所有shared所做的就是返回一个std :: shared_ptr的实例。CreateInstance函数永远不会尝试制作此类的实例,只有得出并实现它的对象。在使用此功能和智能指针之前,我没有遇到此错误。有人知道这里发生了什么吗?
如果您不能使用shared_ptr
的构造函数,请使用其reset
成员函数来提供新对象的所有权:
std::shared_ptr<SYNC::D3D11Shader> shaderPtr;
shaderPtr.reset(SYNC::D3D11Shader::CreateShader(shaderName));
make_shared<T>
不适合这种情况的原因是因为它构建了新的T
,将其参数转发给其构造函数。但是,您已经构建了一个对象,因此您只想将所有权捐赠给您的共享指针。
我强烈建议不要从CreateShader
返回原始指针。您要依靠CreateShader
的呼叫者来知道将其包装在智能指针中,或在其上调用delete
。您最好直接返回unique_ptr
,将所有权传递给客户,然后如果他们愿意,他们可以从中获得shared_ptr
。请参阅以下内容:
std::unique_ptr<SYNC::D3D11Shader> uniquePtr(SYNC::D3D11Shader::CreateShader(shaderName));
// If you want a shared_ptr:
std::shared_ptr<SYNC::D3D11Shader> sharedPtr(std::move(uniquePtr));
或简单:
std::shared_ptr<SYNC::D3D11Shader> sharedPtr = SYNC::D3D11Shader::CreateShader(shaderName);
如果您要使用智能指针,请使用它们。:)
很容易:
shaderPtr.reset(SYNC::D3D11Shader::CreateShader(shaderName));
您可以在此处看到reset
成员函数的不同变体。
相关文章:
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- 如何使用其中一个具体类实例化抽象类?
- 无法实例化抽象类错误
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 'AMA::我的产品':无法实例化抽象类
- 无法实例化抽象类
- 如何修复错误C2259:无法实例化抽象类
- C++,不能实例化抽象类
- 无法使用多重继承 c++ 实例化抽象类
- 无法实例化抽象类
- C++,无法实例化抽象类错误
- C2259:'ATL::CComObject<Base>':无法实例化抽象类
- 错误 C2259:'CDocument':无法实例化抽象类
- 帮助错误 C2259:无法实例化抽象类
- 无法实例化抽象类
- 错误 C2259"类":无法实例化抽象类
- 不能实例化抽象类的对象,但必须返回该类的对象
- 继承错误 - 无法实例化抽象类 无法访问在类中声明的受保护成员
- 无法使用 c++11 实例化抽象类
- 创建 CTI 适配器时无法实例化抽象类