如何将指针转换为不完整的类型,以引用不完整的类型,而无需删除
How to convert a pointer to an incomplete type to a reference to an incomplete type with no dereferencing
是否可以将指向不完整类型的指针转换为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()
{
}
相关文章:
- 字符类型转换不兼容
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- 创建模板类型而不新建/删除
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 何时使用表达式的类型(而不是类别)?
- 表达式必须具有类类型。不知道怎么解决
- 不同c++编译器之间的自动类型推导不匹配
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 使用 AWS c++ 接口将文件上传到 s3 时内容类型标签不正确
- 有没有办法通过插入新类型名称而不是 int 来使用 2 位大小类型而不是 int?
- 模板参数列表中参数 3 处的类型/值不匹配
- 为什么函数返回类型中不允许参数推导?
- 有没有办法用不变语法获得当前的类类型?
- 标准容器模板可以用不完整类型实例化吗?