0

我有一个问题,我有几个头文件,我需要将它们中的每一个都包含在彼此中。显然,这是无法做到的,因为当我编译时,会抛出“包含嵌套太深”的错误——因为这实质上是要求编译器进入无限包含循环。

我可以使用 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*

编辑:我已经在使用包含警卫,这段代码只是为了帮助你了解我想要做什么。

4

4 回答 4

3

你应该使用包括警卫

#ifndef _FILE_A_H_
#define _FILE_A_H_

// Contents of FileA.h...

#endif

可能,还使用前向声明来打破数据结构定义之间的循环依赖关系。

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;
};
于 2013-02-24T18:13:06.760 回答
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;
};
于 2013-02-24T18:12:57.203 回答
1

如果您使用指向其他类的指针或引用,并且头文件中没有代码,则可以使用前向声明:

class A; // Forward declaration

class C; // Forward declaration

class B
{
  public:
    A* p_A;
    C* p_C;
};

如果头文件中的代码引用其他类的任何成员,则必须包含其他类的完整定义。

于 2013-02-24T19:50:41.050 回答
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
于 2013-02-24T18:13:16.377 回答