需要转发声明或完整定义[重复]

问题描述 投票:0回答:2

虽然我已经使用前向声明相当长的时间了,但从未认真考虑过它(我的错误)

如果有人可以给我指点或有关以下查询的任何链接,将会很有帮助:

  1. 我们如何确定是否需要前向声明或包含?
  2. 在这种情况下编译器实际上是如何工作的?有任何开销吗?
  3. 假设我有两个相互依赖的类A和B。它们都使用彼此的对象,我是否需要在这两个类中转发声明。
c++ forward-declaration
2个回答
2
投票

我会这么说:

  1. 如果您只需要标头中类的引用或指针 -> 使用前向声明。
  2. 包含的开销是编译器将看到当前标头的更多依赖项,因此可能会不必要地重新编译您的 C++ 主体文件。
  3. 如果可能的话,是的。

0
投票

当编译器只需要知道某个对象存在,但不需要它的大小或对象的其他详细信息时,始终可以使用前向声明。

例如,在某些 .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;
}

这里有一个带有指针的函数原型。指针的大小始终已知,因此可以在此处使用前向声明。

只要您只使用指针,例如将其传递给其他函数,则不需要包含。如果您尝试访问某些成员或执行其他需要了解更多详细信息的操作,则还需要包含头文件。在上面的示例1中,您不需要完整的声明,前向声明就足够了。在第二个示例中,情况并非如此,因为编译器不知道您的类是否具有被调用的函数。在第三个示例中,仅使用了指针,但由于

new
需要知道大小,因此前向声明是不够的。

为了避免额外的头文件依赖,您可以在上例中的

.h
文件中使用前向声明,并仅在cpp文件本身中进行包含。

© www.soinside.com 2019 - 2024. All rights reserved.