C++ 使多个类包含需要一个标题

C++ 使多个类包含需要一个标题,c++,include,header-files,C++,Include,Header Files,我有很多课程,它们彼此非常接近,就像 class A { //code }; class B { A* field; //code }; class C: public B { //code }; 等等。 我想把它们放在一个单独的标题中(a.h,B.h),但是为了避免将这个标题中的每一个都添加到项目中,我需要一个类似于myLib.h的标题,这将是包含我所写的所有类所需的一个标题。我怎么做到的 我还认为不要使用#pragma一次并使其工作 #ifndef _MY_LIB_H #defi

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

class A
{
//code
};

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

class C: public B
{
//code
};
等等。 我想把它们放在一个单独的标题中(
a.h
B.h
),但是为了避免将这个标题中的每一个都添加到项目中,我需要一个类似于
myLib.h
的标题,这将是包含我所写的所有类所需的一个标题。我怎么做到的

我还认为不要使用
#pragma一次并使其工作

#ifndef _MY_LIB_H
#define _MY_LIB_H
#endif
我应该把它放在哪里?在每个标题中

我试过像这样做

class A;
class B;
...
myLib.h

但是,在
main.cpp
中添加
myLib.h
不足以在那里使用A或B对象。另外,在
B.h

#inlude myLib.h

void someMethod()
{
//field is instance of A
  this.field.otherMethod();
}
导致错误,因为A的方法在
A.h
中声明,而不是在
myLib.h
中声明


很抱歉提出了这么长而复杂的问题。

您应该在
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>

您应该在
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>

除了使用模式之外

#ifndef _A_H
#define _A_H

   ... Stuffs

#endif
在每个标题中,我总是添加

#ifndef _A_H
#include <A.h>
#endif
#ifndef _B_H
#include <B.h>
#endif
....
\ifndef\u A\H
#包括
#恩迪夫
#如果没有
#包括
#恩迪夫
....
到其他标题,如
myLib.h
。这大大提高了编译速度,因为编译器不需要加载和扫描已扫描的低级头


我不会将其添加到我的cpp文件中,因为cpp中的头数通常是合理的,而跟踪头之间的关系则更加困难。

除了使用该模式之外

#ifndef _A_H
#define _A_H

   ... Stuffs

#endif
在每个标题中,我总是添加

#ifndef _A_H
#include <A.h>
#endif
#ifndef _B_H
#include <B.h>
#endif
....
\ifndef\u A\H
#包括
#恩迪夫
#如果没有
#包括
#恩迪夫
....
到其他标题,如
myLib.h
。这大大提高了编译速度,因为编译器不需要加载和扫描已扫描的低级头


我不会将其添加到我的cpp文件中,因为cpp中的标题数量通常是合理的,而跟踪标题之间的关系则更加困难。

此外,您还可以通过使用转发声明来避免一些包含。@EdHeal:感谢您的输入,更新了答案以澄清。严格来说,像
\u A…
这样的名称是为实现保留的,可能最好为标题保护选择不同的约定。您还可以通过使用转发声明来避免一些包含。@EdHeal:感谢您的输入,更新了答案以澄清。严格来说,像
\u A…
这样的名称是为实现保留的,可能最好为标题保护选择不同的约定。