繁体   English   中英

前瞻性声明

[英]forward declaration of class

在阿,我有以下课程

class A
{
  int a;
  char name[100];
}

Bh具有以下代码

class A;
Class B
{
  public:
   int c;
   float d;
   getObjectDetails(A *);
};

我将其编译为g++ Ah Bh B.cpp -o out 但是它会给出编译错误,表明A类不完整。 有人可以帮我理解吗?

另外,如果我在Bh中包含头文件Ah,那么一切都会很好。 在那种情况下,我不需要在定义B类之前声明A类,我可以直接创建并使用A类的实例。在这一点上有人可以澄清吗?

在编译时和运行时在步骤“ A类”声明中会发生什么?

您只能将前向声明与指针和引用一起使用(因为它们的大小是固定的,与它们所引用的对象的大小无关)。 如果按值使用特定的类,则编译器需要完整的定义(以便知道其确切大小),因此前向声明是不够的。

您只能将前向声明用于类型识别,例如在函数/方法指针参数原型中使用声明的类型时。 如果要声明一个成员变量(即std :: string _name;),则编译器需要的内容比前向声明所能提供的更多。 例如,如果某人执行sizeof(Student),则编译器必须有权访问整个声明以找出大小。

PéterTörök 对此 话题的回答。

如果您可以编译的很好

1)在A类声明的末尾添加分号。

2)在B类声明中将“ C”更改为“ c”。

3)将返回类型添加到getObjectDetails()

问题肯定在B.cpp中,因为Bh很好。 如果您尝试使用getObjectDetails()接收到的A*做任何事情(例如对其调用方法),则编译器将无法理解它。

要解决此问题,请尝试在B.cpp中包括Ah(实际上Bh不需要它)。

您可能在B.cpp没有#include "Ah" ,然后使用A来定义A,而不仅仅是声明A。 缺少定义,传递给getObjectDetailsA*唯一可以做的就是将其存储在A*void*变量中,或者将其传递给B.cpp之外的其他代码。

您应该#include来自Bh的Ah而不是做的事情称为前向声明 ,仅在Ah包含大量代码或包含其他这样做的文件时才建议使用。 然后,“ A类”; 事情可能是一种让编译器知道A是一个类,因此可以接受指针和对A对象的引用的快速方法,而无需解析Ah中的所有多余代码。Yah 不足以证明这种破解是合理的。 最好直接使用有关A的权威信息源,即Ah,而不是在整个B中散布有关A的信息(有一天可能不再是真的)。​​我积极不喜欢这种前向声明技巧,建议创建一个包含“ A类”的专用前向声明标头 并且其他任何类Ah都将包含在内,因此,如果不需要不需要完整的声明,则像B这样的用法可以包括它们。 这是由中的标准库完成的,该库向前声明了较重的有用的类,变量和常量。

然后,您的B.cpp应该#include Bh您的命令行应该只是:

g++ B.cpp -o out

(无需提及Ah或Bh,因为它们将分别(间接和直接)包含在B.cpp中。

这段代码

class A;
class B
{
public:
    int c;
    float d;
    void getObjectDetails(A *);
};

使用VC9(VS 2008) 对我来说编译很好,我相信这是正确的。

如果您的代码未编译,则与上面的代码有很大不同 您发现(无法找到它)的唯一方法是获取原始代码(的副本),并逐步逐步删除内容,直到错误消失。
然后,您要么了解问题所在,要么最终得到少于20行的独立示例代码,这些示例代码会重现该错误-完美的复制品可以再次出现在此处并进行询问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM