包含几个类需要一个标题

时间:2012-07-06 08:08:12

标签: c++ include header-files

我有很多课程,他们彼此非常接近,比如

class A
{
//code
};

class B
{
   A* field;
//code
};

class C: public B
{
//code
};

等等。 我想将它们放在一个单独的标题中(A.hB.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中声明。

对于冗长而纠结的问题感到抱歉。

2 个答案:

答案 0 :(得分:2)

您应该在A.hB.hC.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中的标头数通常是合理的,而跟踪标头之间的关系则更加困难。