使一个标头成为多个类包含所必需的



我有很多类,它们彼此非常接近,就像

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 中声明。

对不起,冗长而纠结的问题。

你应该在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以便代码在有人直接包含C.h时编译)。

在某些情况下,您不需要让一个标头包含另一个标头,因为前向声明就足够了 - 例如在 B.h 中,其中声明了A*成员:

#ifndef _B_H
#define _B_H
class A;
class B
{
   A* field;
};
#endif

除了使用模式

#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 中的标头数量通常是合理的,而跟踪标头之间的关系更加困难。

相关内容

最新更新