2012-08-15 93 views
5

我知道类似的问题已经问过,但是在做了我的研究之后,我仍然对循环标题包含了一些问题。C++循环标题包括

//FooA.h 
#ifndef H_FOOA 
#define H_FOOA 

#include "foob.h" 

class FooA{ 
    public: 
     FooB *fooB; 
}; 


//FooB.h 
#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 

现在,如果我有两个循环依赖这是我看到人们在stackoverflow解决问题的方式。我这个唯一的问题是,在我的main.cpp我必须包括fooa.h先foob.h

//main.cpp the right way 
#include "fooa.h" 
#include "foob.h" 

//main.cpp that will surely get a compile error 
#include "foob.h" 
#include "fooa.h" 

现在我的问题是:“有没有办法来转发的方式,将宣布这些类让我不关心在main.cpp中包含头文件的顺序?“

+0

作为答案所指出的那样,你可以在这两个文件使用一个向前声明。如果情况更复杂,你可以从'foob.h'中#include“fooa.h”,这将保证你想要的包含顺序。 – 2012-08-15 14:48:39

+0

示例代码中的内容中没有任何循环。如果你添加缺少的#endif的一切都很好。你得到了什么编译错误? – 2012-08-15 15:10:50

回答

7

有没有办法转发声明这些类的方式,这将允许我不关心在我的main.cpp中包含头文件的顺序?

因为你是用简单的三分球只有打交道,你可以在这两种情况下在这里使用一个向前声明:

FooA.h

#ifndef H_FOOA 
#define H_FOOA 

// #include "foob.h" << not needed! 
class FooB;  // << substitute with a forward declaration of FooB 

class FooA{ 
    public: 
     FooB *fooB; 
}; 
#endif 

FooB.h

#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 
#endif 
+0

@ user1600812确切地说,main可以包含它需要的文件 - 使用这个例子,顺序无关紧要。 – justin 2012-08-15 14:49:43

+0

我想我忘了在我的具体代码中提到。 fooa.h向前声明自己是因为我的代码中有几个自引用指针。在我的具体情况下,我认为你不能按照自己的方式去做,因为我会提前两次宣布一堂课。但是,在我上面提出的解决方案的例子中,谢谢。 – user1600812 2012-08-15 14:55:49

+0

@ user1600812 C++允许多个前向声明(例如,在单独的文件中)。 – justin 2012-08-15 15:06:35

2

您不必关心订单,因为fooa.h包括foob.h,而foob.h的前向声明为FooA。您的代码中已经有一切正确。

+1

Modulo缺少#endif,完全没有问题,因为发布的代码。也没有任何循环,这让我怀疑有一些缺失。 – 2012-08-15 15:09:18

1

由于这两个类只包含一个指针,所以不需要包含另一个头。前瞻性宣言会做。

实际上使用其他类的任何代码都会需要标题,但应该在cpp文件中。

1

在两个头文件中使用前向声明。

你知道你可以在同一行上声明吗?

在 “FooB.h”

class FooB{ 
    public: 
     class FooA *fooA; 
}; 

在 “FooA.h”

class FooA { 
    public: 
     class FooB *fooB; 
}; 
+0

会不会分别引用FooB :: FooA和FooA :: FooB? – 2012-08-15 14:58:32