头文件和多个类的用法(编辑:前向声明)

时间:2013-02-24 18:09:42

标签: c++ file class header include

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

我可以使用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 个答案:

答案 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