gpt4 book ai didi

c++ - 包含头文件时出错

转载 作者:行者123 更新时间:2023-11-30 02:04:48 24 4
gpt4 key购买 nike

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

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

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

最佳答案

这听起来像是在以循环方式包含头文件(A.h 包含 B.h,B.h 包含 A.h)。使用 header 保护意味着当 B.h 在上述场景中包含 A.h 时,它会跳过(由于 A.h 的现在事件的包含保护),因此在解析 B.h 时 A.h 中的类型尚未定义。

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

// A.h
#ifndef A_H
#define A_H

// no #include "B.h"

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

#endif

对于 B.h 也是如此

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

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

// A.cpp

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

// external definitions of A's member functions

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

注意:不支持默认int的错误发生是因为编译器在包含B.h时没有正确定义A,(C语言允许默认int 未知类型的定义,但这在 C++ 中是不允许的)

关于c++ - 包含头文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10159437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com