【发布时间】: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