c++ - 如何在不取消引用的情况下将指向不完整类型的指针转​​换为对不完整类型的引用

标签 c++ incomplete-type

在 C++ 中,可以将指向不完整类型的指针转​​换为对不完整类型的引用吗?

假设我有一个 Widget 类和四个不同的模块:Main、Maker、Widget 和 Transformer。 Main 调用 Maker 中的一个函数来制作一个特殊的 Widget:

// in Maker.h
class Widget;
std::unique_ptr<Widget> makeSpecialWidget();

// in Maker.cpp
#include "Widget.h"
std::unique_ptr<Widget> makeSpecialWidget() { ... }

所有 Maker.h 都是对 Widget 的前向声明。我们会说 Widget 是在 Widget.h 中定义的,我们会说 Maker 需要知道 Widget 的内部结构,所以 Widget.h 包含在 Maker.cpp 中

那么Main不需要了解Widget的任何内部结构,而是需要将其传递给Transformer模块,对Widget进行一些特殊的操作。现在这里是 Transformer.h 中的函数:

// in Transformer.h
class Widget;
std::unique_ptr<Widget> transformWidget(const Widget& widget);

// in Transformer.cpp
#include "Widget.h"
std::unique_ptr<Widget> transformWidget(const Widget& widget) {...}

请注意,transformer 模块引用了一个 Widget,因此它可以在其 header 中使用不完整的类型声明。

现在 Main 可以在不查看 Widget 定义的情况下将 Widget 从 Maker 传递到 Transformer 吗?

即理想情况下,我们希望在 Main.cpp 中:

  #include "Maker.h"
  #include "Transformer.h"  

  std::unique_ptr<Widget> makeAndTransformWidget() {
      std::unique_ptr<Widget> uniquePtrToWidget = makeSpecialWidget();
      Widget* rawPtrToWidget = uniquePtrToWidget.get();
      return transformWidget(/* insert conversion code here */);
  }

那么有没有什么方法可以让Main在看不到Widget.h的定义或者其他正在编写的代码的情况下,将Maker返回的指针传递给Transformer呢?我对这个系统的设计的评论并不感兴趣它更多的是为了说明,我只是对这个问题感兴趣

可以将指向不完整类型的指针转​​换为对不完整类型的引用吗?

通常你会这样做:

const Widget& refToWidget = *rawPtrToWidget;

但是您不能取消引用不完整的类型。 c++ 中是否有任何其他机制来执行此转换?

最佳答案

Can a pointer to an incomplete type be converted to a reference to an incomplete type?

是的。

使用 *rawPtrToWidget 来获取引用是合法的,即使对于不完整的类型也是如此。以下程序使用 g++ 6.4.0 为我编译和构建。

struct Foo;

void test(Foo& ref) {}
void test(Foo* ptr) { test(*ptr); }

int main()
{
}

关于c++ - 如何在不取消引用的情况下将指向不完整类型的指针转​​换为对不完整类型的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48756139/

相关文章:

C++ 字符串函数 - 为什么它们通常具有未指定的复杂性?

c++ - Windows : Invalid function argument when run from GDB 上的 QT

c++ - 我可以在 C 中使用什么来代替 C++ 中的 "string"

C: 给一个不完整类型的数组下标合法吗?

java - java中不兼容的类型

c++ - sdl_image 找不到我的jpg图片;不会加载

c++ - 混合 STL 调试/发布库

c - 如何构建Catboost C评估库API?

c - 在 C 中,是否应该允许我使用指向不完整类型数组的指针?

c++ - 使用匿名命名空间结构 : is this safe? 的 pimpl 习语