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

2023-12-26

我将省略相当多的代码,因为这些是一些相当大的对象,而我的问题实际上只涉及 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,使用其reset成员函数 http://en.cppreference.com/w/cpp/memory/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);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 std::make_shared 抽象类实例化时出错 的相关文章

  • 使用 Html Agility Pack 获取 html 页面上的所有 div id

    如何使用 Html Agility Pack 获取 html 页面上的所有 div id 我正在尝试获取所有 id 并将它们放入一个集合中 p p div class myclass1 div div div div div div div
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • 使用遗留代码(使用reinterpret_cast)真的是一种很好的技术吗?

    下面的代码来自一篇关于C 面试问题的帖子here https www toptal com c plus plus interview questions 我从来不知道这种技术 尽管它声称是一种很好的技术 我的问题是 什么情况下需要使用它
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • StackExchange Redis 删除所有以以下开头的键

    我有一个格式的密钥 Error 1 Error 24 Error 32 Using StackExchange Redis 我该怎么办KeyDelete在与格式匹配的所有键上Error 在另一个答案中我看到了 LUA 脚本 EVAL ret
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 仅使用一个 #include 表达式一次包含多个头文件?

    是否有任何表达式可以使语法一次包含多个标头 而无需为每个新文件编写 include 表达式 例如 include
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 现代编译器的 C++ 中“memset”功能的状态

    Context 不久前 我偶然发现了 Alexandrescu 在 2001 年发表的 DDJ 文章 http www ddj com cpp 184403799 http www ddj com cpp 184403799 它是关于比较将
  • 如何通过分解 y 轴来减小 mschart 的高度

    如何降低 mschart 的高度 如下所示 编辑 就我而言 我不想查看中断图表 this chart1 ChartAreas 0 AxisY ScaleBreakStyle Enabled false 您似乎正在寻找AxisY ScaleB
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 以编程方式阻止 Vista 桌面搜索 (WORDS) 对映射网络驱动器上的 pst 文件建立索引

    经过几天的多次尝试 我没有找到任何 100 的解决方案来解决这个问题 我的搜寻和调查范围 直接访问注册表 HKLM SOFTWARE Microsoft Windows Search CrawlScopeManager Windows Sy
  • 如何检查日期时间是否发生在今天?

    有没有比下面的代码更好的 net 方法来检查 今天 是否发生了 DateTime if newsStory WhenAdded Day DateTime Now Day newsStory WhenAdded Month DateTime
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被

随机推荐

  • 在 MS Access 中对表单上的按钮进行编码

    我正在尝试使用 MS Access 构建数据库 我有两个表 StockFrames 和 Projects 还有一个表单 FrameCheckOut 在表单上 我有一个 FrameID 字段 我们将在其中输入框架 ID 号或扫描其条形码 和一
  • API 2.2 中没有这样的表

    我的应用程序在较高版本中一切顺利 但在较低版本 例如 2 2 中 应用程序在从数据库获取数据时崩溃并出现此错误 07 17 21 46 36 361 I Database 520 sqlite returned error code 1 m
  • 在可可状态应用程序中显示图像

    你好 我开发了一个可可状态应用程序 例如 当我放置一个长标题时 它无法显示 如果我也放置一个图像作为图标 它也无法显示 但如果我放置一个小标题 它就可以正常工作 我该如何解决这个问题并使图像显示出来 statusItem NSStatusB
  • 块控制+Alt+删除

    I am doing an Online Quiz project in C The test client is a Windows Desktop Application running on Windows XP I need to
  • Spark JDBC 伪列不起作用

    对于我的用例 我尝试使用 Spark JDBC 读取一张大的 Oracle 表 因为我的表中没有整数类型列 所以我正在使用rownum as paritionColumn 我的 Spark 查询如下所示 为了测试 我使用只有 22000 行
  • Objective-C/cocoa框架中的NSAutoreleasePool有什么魔力?

    我发现 Objective C cocoa 框架的示例有以下代码 int main NSAutoreleasePool pool NSAutoreleasePool alloc init Create an array NSArray mo
  • 使用 C 预处理获取字符串的整数值

    我将如何创建一个C宏获取字符串的整数值 具体用例来自一个问题here https stackoverflow com questions 9524342 how to specify enum size in gcc 我想像这样更改代码 e
  • 具有固定页眉和页脚以及可滚动内容的 Flexbox

    我正在尝试让弹性盒设计发挥作用 我不是 HTML CSS 专家 我有一个弹性盒设计 具有固定的页眉和页脚以及占据页面其余可用空间的内容 当我将数据放入比可用空间长的内容区域时 内容会滚动 但我想实现不同的目标 我想在内容区域中有几个 div
  • CodeIgniter GROUP_CONCAT 并加入

    我试图找到一种方法将这两个表连接在一起 我能够做到这一点 但如果它发现多个匹配的值 它会再次显示产品表中的所有内容 现在我尝试一起使用 MySQL group concat 以便能够列出数组中一个字段中的所有 tName 但我不断收到 My
  • 将 MySQL 转储导入到 PostgreSQL 数据库

    如何将 xxxx sql 转储从 MySQL 导入到 PostgreSQL 数据库 这个问题有点老了 但几天前我正在处理这种情况并发现pgloader io http pgloader io 这是迄今为止最简单的方法 您需要安装它 然后运行
  • java.util.concurrent.TimeoutException:android.view.ThreadedRenderer.finalize() 10秒后超时

    我收到了有关 Lollipop 的奇怪崩溃报告 我的应用程序基本上是一个浏览器 因此它大量使用 WebView 但我不知道问题在那里发生 无论如何 崩溃报告没有提供太多有用的信息 这基本上就是我在下面粘贴的内容 java util conc
  • atob 函数不应在新代码中使用?

    我需要使用atob在我正在处理的 React 项目中 有一个函数 但 VSCode 在函数调用中插入了一行 悬停时我收到以下消息 提供此功能只是为了与旧版 Web 兼容 平台 API 永远不应该在新代码中使用 因为它们使用 表示二进制数据的
  • 无法收集 pydev 的 python 解释器信息

    操作系统 Windows 7 x64 蟒蛇 2 7 3 pydev 2 7 1 2012100913 Eclipse 版本 Juno Service Release 1 内部版本号 20121004 1855 我无法在 Pydev 中配置
  • 如何检查exe是否从服务器访问

    这是一个客户端服务器应用程序 我正在创建一个更新程序 它将替换 exe 文件列表 运行脚本以及其他需要更新的内容 这将安装在服务器上 首先 我需要检查可执行文件是否通过网络共享打开 我可以通过进入计算机管理然后共享文件和打开文件来手动执行此
  • 在keras中定义模型(include_top = True)

    有人能告诉我在 keras 中定义模型时 include top True 意味着什么吗 我在 Keras 文档中读到了这一行的含义 它表示 include top 是否包含网络顶部的全连接层 我仍在寻找这行代码的直观解释 ResNet50
  • Dropwizard Response.status(Response.Status.NOT_FOUND).build() 返回 html

    如果确实缺少资源 我的 API 将返回以下内容 code 404 message HTTP 404 Not Found 当我使用代码通过我的资源返回 404 时Response status Response Status NOT FOUN
  • 在 LINQ to 对象的语句中

    LINQ to 对象中是否存在与 SQL IN 语句等效的语句 Yes Contains http msdn microsoft com en us library system linq enumerable contains aspx
  • Java 中的 PPMD​​ 压缩?

    有谁知道 PPMD 压缩算法的 Java 实现吗 我还没有找到 Java 实现 但有一个 C 实现http users senet com au mjbone Compression html http users senet com au
  • 如何在 Windows 窗体应用程序中创建全局错误处理程序?

    我认为有一个组件允许创建全局错误处理 例如 当发生不好的事情时 我自己会抛出异常 例如 throw new ArgumentNullException playlist is empty 我怎样才能在全球范围内捕捉到它 您可以通过以下方式完
  • 使用 std::make_shared 抽象类实例化时出错

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