【问题标题】:How to convert a pointer to an incomplete type to a reference to an incomplete type with no dereferencing如何在不取消引用的情况下将指向不完整类型的指针转​​换为对不完整类型的引用
【发布时间】:2018-07-23 04:38:37
【问题描述】:

指向不完整类型的指针能否在 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,因此它可以避免在其标头中使用不完整的类型声明。

现在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 有什么方法可以将 Maker 返回的指针传递给 Transformer,而无需查看 Widget.h 的定义或正在编写的任何其他代码?我对这个系统设计上的 cmets 不是很感兴趣,更多的是为了说明,我只是对这个问题感兴趣

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

通常你会这样做:

const Widget& refToWidget = *rawPtrToWidget;

但您不能取消引用不完整的类型。 c++中是否有其他机制可以进行这种转换?

【问题讨论】:

    标签: c++ incomplete-type


    【解决方案1】:

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

    是的。

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多