8

我知道之前有人问过与此类似的问题,但在进行研究之后,我仍然对循环标题包含有疑问。

//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 中包含头文件的顺序?”

4

4 回答 4

14

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

由于您只处理简单的指针,因此您可以在这两种情况下使用前向声明:

呸呸呸

#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
于 2012-08-15T14:42:53.363 回答
3

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

于 2012-08-15T14:42:42.793 回答
1

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

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

在“FooB.h”中

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

在“FooA.h”中

class FooA {
    public:
        class FooB *fooB;
};
于 2012-08-15T14:46:42.057 回答
1

由于两个类都只包含一个指针,因此您不需要包含另一个标头。一个前向声明就可以了。

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

于 2012-08-15T14:44:54.720 回答