在 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/