尽管我已经使用前向声明很长一段时间,但从未认真考虑过(我的错误)
如果有人可以给我指点或有关以下查询的任何链接,将会很有帮助:
- 我们如何确定是否需要前向声明或包含?
- 在这种情况下,编译器实际上是如何工作的?任何开销?
- 假设我有两个相互依赖的类 A 和 B。它们都使用彼此的对象,我是否需要在两个类中转发声明。
尽管我已经使用前向声明很长一段时间,但从未认真考虑过(我的错误)
如果有人可以给我指点或有关以下查询的任何链接,将会很有帮助:
我想说的是:
当编译器只需要知道某个对象存在,但不需要它的大小或对象的其他详细信息时,总是可以使用前向声明。
例如,在某些 .h 文件中,您有:
MyClass *foo(MyClass *p);
在 example1.cpp 中:
// No include needed, forward declaration is ok.
MyClass *foo(MyClass *p)
{
foo2(p);
return p;
}
在 example2.cpp 中:
// include needed, forward declaration is not ok.
MyClass *foo(MyClass *p)
{
p->ClassFkt();
return p;
}
在 example3.cpp 中:
// include needed, forward declaration is not ok.
MyClass *foo(MyClass *p)
{
MyClass *n = new MyClass();
foo2(p, n);
return n;
}
在这里,您有一个带有指针的函数原型。指针的大小总是已知的,所以这里可以使用前向声明。
只要您只使用指针,例如将其传递给其他函数,您就不需要包含。如果您尝试访问某些成员或进行其他需要了解更多详细信息的操作,则还需要包含头文件。在上面的例子中,你不需要完整的声明,前向声明就足够了。在第二个例子中它不是,因为编译器不知道你的类是否有被调用的函数。在第三个示例中,仅使用了指针,但由于new
需要知道大小,因此前向声明是不够的。
为了避免额外的头依赖,您可以.h
在上面的示例中使用文件中的前向声明,并且只在 cpp 文件本身中进行包含。