在一个步骤中转发声明和使用
Forward declaring and using in one step
作为一种优化,或者为了避免包含循环,可以向前声明一个类型,这会导致类似以下代码:
class A;
class B
{
A *a;
};
如果正向声明的数量变大,它可能会占用头文件顶部的大量空间。有没有一种方法可以同时向前声明和使用?有点像:
class B
{
extern A *a;
};
我以前从未真正想过这一点,但我有一个包含一堆前向声明的标题,我想让它更整洁(而不是将它们转换为另一个包含文件)。
编辑:我把"a"改成了指针,因为有人正确地指出,你只能在指针和引用上使用前向声明。
您的要求并不完全清楚,但如果我理解正确,您可以在声明变量的同时转发声明:
class B
{
class A* a; // declaring A as class is an in-place forward declaration
};
你是这个意思吗?
正向声明不允许进行
class A;
class B
{
A a;
};
除非A
是引用或指针类型,因为正向声明不会提供任何关于对象大小的附加信息(除非是C++11中的enum class
)。那么你在使用指针/引用吗?否则,这意味着您肯定包含了A
的定义。
关于你的问题,没有办法向前声明和使用类型,因为我们谈论的是两件不同的事情。变量声明不是定义类型,而是定义变量。
解决问题的一个简单方法是将所有正向声明收集到一个单独的头文件中,并将其包含在项目中(或最终的预编译头中)。这不会造成太多问题,因为前瞻性声明不会暴露任何内容,也不是重量级的。
不,你不能随心所欲。这个关于正向声明的答案应该会给你所有血腥的细节,但总的来说,如果你想使用一个类型,你需要它的完整定义(包括或多或少的定义);而不仅仅是它存在的事实(正如正向声明或多或少所做的那样)。
相关文章:
- 如何在 C++ 中转发声明 std::set?
- C++使用默认模板参数键入别名和转发声明
- 如何转发声明枚举?
- 使用函数指针转发声明作为 lamba 声明
- 如何将枚举类转发声明为模板化类的内部类?
- 转发声明在命名空间中不起作用的替代方法
- 如何正确转发声明结构"using XXX"?
- 在类内和类外的定义处执行类转发声明是否有区别
- 为什么转发声明的好友类不能在类中引用?
- 如何访问转发声明类的成员
- 仅在标头开发中转发声明
- 无法转发声明C typedef结构-正在查找其他建议
- boost::hana 转发声明标头的用例是什么?
- 循环包含依赖项/转发声明
- c++ 使用复杂的依赖项获取正确的转发声明
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 有没有办法转发声明命名空间或只是提前使其可见
- 有没有办法在不引用其模板类型的情况下转发声明指向类的指针
- 我如何转发声明boost ::精神统治
- 标题文件中大规模转发声明类别的风险是什么?