1

嗨,我有两个班级 A 和 B 。在 A 中,我正在使用 B 的头文件,以便我可以为 B 创建一个实例(例如 B *b ),而我在 B 类中所做的事情也包括 A 的头文件并为 A 创建实例(例如A *a) 在 B 中。

当我在 B 中包含 A 的头文件时,它在 Ah 中给了我以下错误

1>c:\Bibek\A.h(150) : error C2143: syntax error : missing ';' before '*'
1>c:\Bibek\A.h(150)(150) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\Bibek\A.h(150)(150) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
4

1 回答 1

4

听起来您以循环方式包含头文件(Ah 包含 Bh,其中包含 Ah)。使用标头保护意味着当 Bh 在上述场景中包含 Ah 时,它会跳过它(由于 Ah 的现在活动的包含保护),因此在解析 Bh 时尚未定义 Ah 中的类型

要修复,您可以使用前向声明:

// A.h
#ifndef A_H
#define A_H

// no #include "B.h"

class B; // forward declaration of B
class A {
  B* b;
};

#endif

同样对于 Bh

这允许您使用前向声明类的指针(例如,在成员变量声明、成员函数声明中),但不能在头文件中以任何其他方式使用它。

然后在 A.cpp 中你需要有正确的 Bh 定义,所以你包括它:

// A.cpp

#include "A.h"
#include "B.h" // get the proper definition of B

// external definitions of A's member functions

这种结构避免了头文件的循环包含,同时允许充分使用类型(在 .cpp 文件中)。

注意:不支持默认 int 的错误是因为编译器没有正确定义A何时包含 Bh,(C 语言允许int对未知类型进行默认定义,但在 C++ 中不允许这样做)

于 2012-04-15T04:21:44.023 回答