使一个标头成为多个类包含所必需的
Making one header to be needed for several classes inclusion
我有很多类,它们彼此非常接近,就像
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
中声明。
对不起,冗长而纠结的问题。
你应该在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
以便代码在有人直接包含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 中的标头数量通常是合理的,而跟踪标头之间的关系更加困难。
相关文章:
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- C++ .h 包含从一个类传递到另一个类的类和.cpp
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 如何为包含另一个类实例的数组制作常量 getter?
- 使用按位运算确定值是否包含另一个值
- 如何在我的 cmake 项目中包含另一个 cmake 项目的头文件?
- 如何查找哪个标头在包含树中包含另一个标头
- 包含另一个实例的特征实例,该实例持有固定大小的特征对象
- 包含另一个对象的对象,然后将其传递给它(C )
- 将多个原型文件包含在一个项目中会导致protobuf_AssignDescriptorsOnce()已经有一个主体
- C++初始化包含另一个对象设计问题的对象
- 程序检查是否包含另一个数字
- 包含另一个对象指针向量的对象
- 如何将我的C++DLL包含在一个单独的项目中
- 当动态创建一个包含另一个动态创建的结构数组的结构数组时,内存管理
- BITWISE-如何检查二进制号是否包含另一个数字
- 使一个标头成为多个类包含所必需的
- 另一个对象所包含的一个对象如何可以更改容器对象的私有数据成员
- 创建一个类,其静态成员容器包含所述类的所有实例