我有一个问题,我有几个头文件,我需要将它们彼此包含在内。显然,这是无法做到的,因为当我编译时,会抛出错误“包含太深的嵌套” - 因为这实际上要求编译器进入无限包含循环。
我可以使用void指针修复它,但这对我来说似乎是错误的编码练习。
这是我想要做的一个例子,以帮助理解:
文件-A:
#include "File-B"
#include "File-C"
class A
{
public: B* p_B;
public: C* p_C;
};
文件-B:
#include "File-A"
#include "File-C"
class B
{
public: A* p_A;
public: C* p_C;
};
文件-C:
#include "File-B"
class C
{
public: B* p_B;
};
这只显示了每个类声明的位置。肯定有一个更好的解决方案void*
。
答案 0 :(得分:3)
您应该使用 include guards :
#ifndef _FILE_A_H_
#define _FILE_A_H_
// Contents of FileA.h...
#endif
也可以使用 forward declarations 来打破数据结构定义之间的循环依赖关系。
在FileA.h
:
class B; // No need to #include "FileB.h"
class A
{
public:
B* pB;
};
在FileB.h
:
class A; // No need to #include "FileA.h"
class B
{
public:
A* pA;
};
答案 1 :(得分:1)
我会使用包含警戒,只包含一次某个文件。
#ifndef FILE_A
#define FILE_A
class A
{
public: B* p_B;
public: C* p_C;
};
#endif
http://en.wikipedia.org/wiki/Include_guard
每个文件只包含一次头文件。 你也可以使用#pragma_once,虽然它不是标准的。
如果不起作用,您可以使用前向声明。
class B;
class C;
class A
{
public: B* p_B;
public: C* p_C;
};
答案 2 :(得分:1)
如果您使用指针或对其他类的引用,并且头文件中没有代码,则可以使用前向声明:
class A; // Forward declaration
class C; // Forward declaration
class B
{
public:
A* p_A;
C* p_C;
};
如果头文件中的代码引用其他类的任何成员,则必须包括其他类的完整定义。
答案 3 :(得分:0)
这就是你有#include <>
警卫的原因。
#ifndef _FILE_B
#define _FILE_B
#include "File-A"
#include "File-C"
class B
{
public: A* p_A;
public: C* p_C;
};
#endif