gpt4 book ai didi

c++ - 使用 std::make_shared 抽象类实例化时出错

转载 作者:可可西里 更新时间:2023-11-01 18:17:44 25 4
gpt4 key购买 nike

我将省略相当多的代码,因为这些是一些相当大的对象,而我的问题实际上只涉及 std::make_shared 的操作。我在名为 D3D11Shader 的命名空间 SYNC 中有一个对象。这有一个名为 static 的函数,

SYNC::D3D11Shader * SYNC::D3D11Shader::CreateInstance(const std::string & s)

它将采用字符串索引并返回指向从 SYNC::D3D11Shader 派生的着色器实例的指针。有一次我开始使用智能指针在包含所有这些着色器的 vector 中自动重新分配它们。然而,当我去做这件事时,

 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的构造函数, 使用其 reset member function赋予它新对象的所有权:

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);

如果您要使用智能指针,请使用它们。 :)

关于c++ - 使用 std::make_shared 抽象类实例化时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com