与问here的情况有些类似。
我有一个A类,它有一个指向B类的成员指针。
//A.h
class B;
class A {
B *b;
public:
B *GetB();
};
B在其自己的文件中定义。
现在,每当我加入A.h并想要访问A的成员时,我也必须包括B.h.如果A和B都有相当大的标题(想想旧的讨厌的遗留代码),那么每当我包含一个或时,最好继续包括两个标题,只需要包含Bh并使用它完成?
标题非常大,但我们的大多数代码都需要两者,我只是好奇是否有某种设计模式决定在这种情况下做出的最佳决策。
答案 0 :(得分:0)
使用预处理器包装头文件,以确保它们只包含一次..
on B.h
define
#ifndef __B_HEADER__
#define __B_HEADER__
.... B header files goes here....
#endif
然后在A.h
定义
#ifndef __A_HEADER__
#define __A_HEADER__
#include <B.h>
.... A header files goes here....
#endif
然后在需要时仅包含A.h
。
我个人更喜欢包含我知道和想要使用的头文件 - 我不想被我使用的组件的dependendcy树打扰。
当您在C ++ STD库中包含<iostream>
时,您是否真的想知道并明确包含所有<iostrem>
依赖项(如果有)?
答案 1 :(得分:0)
这是意见,当然。对我来说,归结为使用A而不是B是否合理。如果A有大量操作而且其中只有一个涉及B,那么不,我不会包括B.h.为什么只调用A.Foo()和A.Bar()的人需要支付包含额外标题的开销?
另一方面,如果A是B工厂(例如)并且您无法想象有人使用它而不使用B,那么将A.h包含在A.h中可能是有意义的。
如果A有一个类型B的成员变量(不是B *),结果是包含Ah的任何人必须也包括Bh以便编译,那么我肯定会包含它在啊