具有多重循环包含的命名空间
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.h
和 B.h
中包含 A.h
。只在B.cpp
和C.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
我有 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.h
和 B.h
中包含 A.h
。只在B.cpp
和C.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