具有公共访问的成员指针的前向声明

时间:2014-05-15 12:50:57

标签: c++ forward-declaration

与问here的情况有些类似。

我有一个A类,它有一个指向B类的成员指针。

//A.h
class B;
class A {
    B *b;
public: 
    B *GetB();
};

B在其自己的文件中定义。

现在,每当我加入A.h并想要访问A的成员时,我也必须包括B.h.如果A和B都有相当大的标题(想想旧的讨厌的遗留代码),那么每当我包含一个时,最好继续包括两个标题,只需要包含Bh并使用它完成?

标题非常大,但我们的大多数代码都需要两者,我只是好奇是否有某种设计模式决定在这种情况下做出的最佳决策。

2 个答案:

答案 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以便编译,那么我肯定会包含它在啊