【问题标题】:shared_ptr with incomplete types from library库中类型不完整的 shared_ptr
【发布时间】:2013-07-13 01:26:46
【问题描述】:

我的问题很简单:我正在使用 SDL 创建一个简单的模拟,我想将 TTF_Font 类型的实例存储在智能指针 (shared_ptr) 中,但我不断收到此错误:

“‘sizeof’对不完整类型‘_TTF_Font’的无效应用”

有没有办法使用来自外部库的不完整类型的智能指针而不将它们的源代码合并到我的程序中?

编辑:

TTF_Font 被声明为

typedef struct _TTF_Font TTF_Font;

_TTF_Font 依次在编译的外部库中定义。

我对 TTF_Font 的使用只是构造一个新的堆栈分配的 shared_ptr 实例,并带有一个指向 TTF_Font 的原始指针:

auto font_sp = std::shared_ptr<TTF_Font>(font_p);

我在这里没有明确使用 sizeof

【问题讨论】:

  • 请显示一些代码。您如何使用 sizeof 运算符以及 TTF_Font 定义为什么?

标签: c++ sdl shared-ptr


【解决方案1】:

通常有一个不完整类型的shared_ptr 应该可以工作。你可以像这样声明一个函数

typedef struct _TTF_Font TTF_Font;
std::shared_ptr<TTF_Font> makeFont();

在头文件中没有问题。 makeFont() 的实现需要查看 TTF_Font 类的完整定义。因此,在实现文件中,您需要包含定义TTF_Font 类的文件。如果您想隐藏此实现细节,您可以考虑将makeFont() 放入您包含在项目中的库中。这样,您的项目不需要包含定义 TTF_Font 的头文件,除非您出于其他原因想要访问此类的成员。

关于您的编辑:

当您从指针创建shared_ptr 时,shared_ptr 将在内部存储如何删除该对象。为此,shared_ptr 需要查看指向的类型的析构函数。因此,即使没有调用构造函数,shared_ptr 也需要查看结构定义。

【讨论】:

  • 我回家后会检查您的答案,因为我的桌面上有项目。我会记得你是第一个;)
  • typedef 不会改变任何东西。请记住,我包含具有相同 typedef 的标头,因此它已经存在。我试图向 shared_ptr 构造函数提供我自己的删除器并修复了错误,但是当我输入“delete p;”时在那个删除器中,我收到了关于 _TTF_Font 类的前向声明的警告,并注意到它既不是析构函数,也不是特定于类的运算符 delete 将被调用。这不是问题,因为该库中有一个函数实际上删除了指针,所以我可以使用它,但一般情况下我仍然无法删除指针。
  • 这就是我告诉你的。但是有一个库函数可以用于自定义删除器,这很好。
  • @RalphTandetzky 你好,请问如果我想在我的作业 ptr 中添加关于 incomplete 类型的类似功能,我应该怎么做?
  • @VMAtm 你想用不完整类型解决什么问题?
猜你喜欢
  • 2014-10-13
  • 2017-03-29
  • 2011-01-26
  • 2011-07-13
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多