具有多重循环包含的命名空间

Namespaces with multiple cyclic inclusion

我有 3 个 class 属于命名空间 "MyNS"。 "A" 使用 "B" 和 "C",而 "B" 和 "C" 使用 "A"。这是我的 headers 的结构:

//mynamespace.h
#ifndef SOMENAMESPACE_H
#define SOMENAMESPACE_H
namespace MyNS {
     class A;
     class B;
     class C;
}
#endif
/*******************************************************/
//A.h
#ifndef A_H
#define A_H

#include "mynamespace.h"
#include "B.h"
#include "C.h"

class MyNS::A {
    ..
    MyNS::B someMethod(args);
    MyNS::C someMethod2(args);
    ..
};
#endif
/*******************************************************/
//B.h
#ifndef B_H
#define B_H

#include "mynamespace.h"
#include "A.h"

class MyNS::B {
    ..
    MyNS::A *someMember;
    ..
};
#endif
/*******************************************************/
//C.h
#ifndef C_H
#define C_H

#include "mynamespace.h"
#include "A.h"

class MyNS::C {
    ..
    MyNS::A *someMember;
    ..
};
#endif

每个 classes 都有一个包含以下行的 C++ 源文件:

using namespace MyNS;

编译器被 B.h header 守卫停止,这就是为什么我在 A::someMethod(args) 中出现 "incomplete type 'class B'" 错误。

我知道我可以在 "mynamespace.h" 中包含所有 class 定义,但是 class 很长,这让我的 header 文件变得臃肿,这就是为什么我不得不这样分开。

如何使此代码与单独的 header 文件一起工作?

正确的方法是使用 forward declaration。不要在 C.hB.h 中包含 A.h。只在B.cppC.cpp中实际执行#include "A.h"。命名空间中的前向声明应该足够了。

//mynamespace.h
#ifndef SOMENAMESPACE_H
#define SOMENAMESPACE_H
namespace MyNS {
     class A;
     class B;
     class C;
}
#endif
/*******************************************************/
//A.h
#ifndef A_H
#define A_H

#include "mynamespace.h"
#include "B.h"
#include "C.h"

class MyNS::A {
    ..
    MyNS::B someMethod(args);
    MyNS::C someMethod2(args);
    ..
};
#endif
/*******************************************************/
//B.h
#ifndef B_H
#define B_H

#include "mynamespace.h"

class MyNS::B {
    ..
    MyNS::A *someMember;
    ..
};
#endif
/*******************************************************/
//C.h
#ifndef C_H
#define C_H

#include "mynamespace.h"

class MyNS::C {
    ..
    MyNS::A *someMember;
    ..
};
#endif