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

时间:2015-05-04 23:21:44

标签: c++ header namespaces include forward-declaration

我有3个属于命名空间“MyNS”的类。 “A”使用“B”和“C”,而“B”和“C”都使用“A”。以下是我的标题的结构:

//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

每个类都有一个C ++源文件,其中包含以下行:

using namespace MyNS;

编译器被B.h标头警卫拦截,这就是我在A :: someMethod(args)中出现“不完整类型'B类'错误的原因。

我知道我可以在“mynamespace.h”中包含所有类定义,但是这些类很长,这使得我的头文件变得臃肿,这就是我必须将它们分开的原因。

如何使用单独的头文件来使用此代码?

1 个答案:

答案 0 :(得分:2)

执行此操作的正确方法是使用forward declaration。请勿在{{1​​}}和A.h中加入C.h。仅在B.h#include "A.h"中实际执行B.cpp。命名空间中的前向声明应该足够了。

C.cpp