2013-02-24 57 views
0

我有一个问题,我有几个头文件,我需要包括他们每个人在对方。显然,这是不能做到的,因为当我编译时,会抛出错误“include nested too deeply” - 因为这基本上要求编译器输入一个无限循环。头文件和多个类的用法(编辑:转发声明)

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

这只是显示在哪里e ach类声明是必要的。当然有更好的解决方案void*

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

回答

1

如果您正在使用指针或引用的其他类,并在头文件没有代码,你可以使用前置声明:

class A; // Forward declaration 

class C; // Forward declaration 

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

如果在头文件中的代码是指任何成员的其他类,你将不得不包含其他类的全部定义。

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; 
}; 
+0

你可能已经切换了。首先使用前向声明,然后包含这些文件。当访问或引用其他类中的任何内容时,类定义是必需的。 – 2013-02-24 19:52:20

3

您应该使用include guards

#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; 
}; 
+0

似乎downvoter对每个人都试图回答这个问题感到不安... – 2013-02-24 18:15:12

+0

嗨,前瞻性声明是我在找什么,谢谢我会在第二秒接受这个答案... – user3728501 2013-02-24 18:16:51

+0

好,虽然结构声明应该可以是类声明。 – 2013-02-24 18:20:39

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 
+0

downvoter谨慎解释? – 2013-02-24 18:14:49

+0

他不希望这个问题很可能得到回答。他低估了他们的一切。 – 2013-02-24 18:15:34

+0

@AndyProwl允许对方补偿。 – 2013-02-24 18:16:02