我有很多课程,他们彼此非常接近,比如
class A
{
//code
};
class B
{
A* field;
//code
};
class C: public B
{
//code
};
等等。
我想将它们放在一个单独的标题中(A.h
,B.h
...)但是为了避免将每个标题添加到项目中,我需要一个像myLib.h
这样的标题,只是一个需要的标题,包括我写的所有类。我能实现吗?
另外,我认为不要使用#pragma once;
并使其正常工作
#ifndef _MY_LIB_H
#define _MY_LIB_H
#endif
我应该把它放在哪里?在每个标题中?
我尝试过这样做
class A;
class B;
...
myLib.h
中的
但是将myLib.h
添加到main.cpp
并不足以在那里使用A或B对象。另外,在B.h
中
#inlude myLib.h
void someMethod()
{
//field is instance of A
this.field.otherMethod();
}
导致错误,因为A的方法在A.h
中声明,而不在myLib.h
中声明。
对于冗长而纠结的问题感到抱歉。
答案 0 :(得分:2)
您应该在A.h
,B.h
,C.h
的每一个中使用单独的包含警示:
// Note: not a good name for a guard macro (too short)
#ifndef _A_H
#define _A_H
// definition of A
#endif
然后MyLib.h
变得简单:
#include<A.h>
#include<B.h>
#include<C.h>
当然,每个标头都应手动包含所需的其他标头,以便它可以独立存在(例如C.h
需要包含B.h
,以便在有人包含{{}}时编译代码直接{1}}。
在某些情况下,您不需要让一个标题包含另一个标题,因为前向声明就足够了 - 例如在C.h
中,声明了B.h
成员:
A*
答案 1 :(得分:2)
除了使用模式
#ifndef _A_H
#define _A_H
... Stuffs
#endif
在每个标题中,我总是添加
#ifndef _A_H
#include <A.h>
#endif
#ifndef _B_H
#include <B.h>
#endif
....
到其他标头,例如myLib.h
。这大大提高了编译速度,因为如果已经扫描了编译器,则编译器不需要加载和扫描低级标题。
我不会将此添加到我的cpp文件中,因为cpp中的标头数通常是合理的,而跟踪标头之间的关系则更加困难。