如何将指针转换为不完整的类型,以引用不完整的类型,而无需删除

How to convert a pointer to an incomplete type to a reference to an incomplete type with no dereferencing

本文关键字:类型 用不完 引用 删除 指针 转换      更新时间:2023-10-16

是否可以将指向不完整类型的指针转换为C 中不完整类型的引用?

假设我有一个类小部件和四个不同的模块:主,制造商,小部件和变压器。Main在Maker中呼叫一个特殊小部件的功能:

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

所有Maker.h具有对小部件的正向声明。我们要说的是小部件在widget.h中定义了窗口小部件。

然后,main不需要任何窗口小部件的内部设置的任何知识,但是它需要将其传递给变压器模块以在小部件上进行一些特殊操作。现在这是变压器中的功能。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) {...}

请注意,变压器模块对小部件进行了引用,因此它可以在其标题中使用不完整的类型声明。

现在可以主通过一个小部件从制造商传递到变压器,而无需看到小部件的定义?

即。理想情况下,我们需要在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是否有任何方法可以将Maker返回的指针传递给Transformer,而无需看到Widget.h的定义或任何其他代码写的代码?我对有关该系统设计的评论并不感兴趣,这更多的是插图,我只是对这个问题

感兴趣

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

通常您会做:

const Widget& refToWidget = *rawPtrToWidget;

,但是您不能解除不完整的类型。C 中是否还有其他机制可以进行此转换?

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

是。

使用*rawPtrToWidget仅获取参考,即使对于不完整的类型也是合法的。以下程序编译并使用G 6.4.0。

为我构建
struct Foo;
void test(Foo& ref) {}
void test(Foo* ptr) { test(*ptr); }
int main()
{
}