如何将指向不完整类型的指针转​​换为对不完全类型的引用而不解除引用

时间:2018-02-12 21:53:54

标签: 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) {...}

请注意,变换器模块会引用一个Widget,因此它可以在其标题中使用不完整的类型声明。

现在可以将Midget从Maker传递给Transformer,而不会看到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 ++中有没有其他机制来进行这种转换?

1 个答案:

答案 0 :(得分:2)

  

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

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

struct Foo;

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

int main()
{
}
相关问题