C++ 具有多个循环包含的名称空间
我有3个属于名称空间“MyNS”的类。“A”使用“B”和“C”,而“B”和“C”都使用“A”。以下是我的标题的结构:C++ 具有多个循环包含的名称空间,c++,header,namespaces,include,forward-declaration,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 /*******************************************************/ /
//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)中遇到“不完整类型'class B'”错误的原因
我知道我可以在“mynamespace.h”中包含所有的类定义,但是这些类很长,这使得我的头文件膨胀,这就是为什么我必须像这样将它们分开
如何使此代码与单独的头文件一起工作?正确的方法是使用。不要在
C.h
和B.h
中包含A.h
。仅实际执行#在B.cpp
和C.cpp
中包含“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
你的问题是什么?如何让代码在没有错误的情况下工作。函数定义在哪里?在cpp文件中定义函数。cpp文件将执行包含。我还对我的答案进行了一些编辑,以便您可以在a.h中实际使用B和C,但在B.h和C.h中不能使用a。