我有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”中包含所有类定义,但是这些类很长,这使得我的头文件变得臃肿,这就是我必须将它们分开的原因。
如何使用单独的头文件来使用此代码?
答案 0 :(得分:2)
执行此操作的正确方法是使用forward declaration。请勿在{{1}}和A.h
中加入C.h
。仅在B.h
和#include "A.h"
中实际执行B.cpp
。命名空间中的前向声明应该足够了。
C.cpp