【问题标题】:Header file - Inheritance c++头文件 - 继承 c++
【发布时间】:2020-02-25 18:53:10
【问题描述】:

我在 C++ 方面的经验非常有限,所以如果我的问题是愚蠢的或基本的,请原谅。如下:

当用像 c++ 这样的语言做更大的项目时,你可能有一个很大的继承线,比方说,在主文件中包含每个派生类是正常的做法吗? 有什么办法可以规避这个问题,还是我错过了一些平庸的东西?

谢谢。

【问题讨论】:

  • 如果AB的基类是C的基类,每个都有自己的头文件a.hb.hc.h ,然后c.h 将(希望并且通常)包括b.h,其中将包括a.h。如果您只需要c.h 的功能,则无需#include a.hb.h
  • 例如,如果 B 类有 5 个子类,如何在不明确包含它们的情况下从每个子类中获取功能 你需要如果您想在同一个翻译单元中全部使用它们,请包含它们。
  • @Jens 子类是什么意思?我总是在我的脑海中得到那个模糊的方向。 base 和 derived 是更多的 C++ 术语。如果您当前的.cpp 文件直接使用类B 的对象,则只包含b.h。如果您当前的.cpp 文件直接使用BCJQ 类的对象,则明确包括b.hc.hj.hq.h。不要依赖其中任何一个来继续从任何其他人(因此相互包括)继承。
  • @John 你的最后一条评论更好地解释了我试图表达的观点。如果您使用 X.h,请包含 X.h。如果你不这样做,就把它排除在外。如果 Y.h 需要 X.h 并且不包含 X.h,则修复 Y.h。
  • @Jens 您确定需要五个单独的标题吗?如果它们紧密相关,它们可能都在一个标题中。在某些情况下,收集常见标头的“上帝”标头也可能适用。

标签: c++ oop inheritance header-files


【解决方案1】:

对于使用 C++ 类的 C++ 程序,它需要声明。如果该类继承自基类,则需要这些声明来处理该类声明。这递归地应用:需要类的整个继承树。

如果继承图如此深入和广泛(可能是由于多重继承)以至于项目认为它不可接受,则必须对其进行重组。类可能能够使用聚合而不是继承。也就是说,而不是:

#include <widget.h>

class foo : public widget { ... };

可能有;

class widget; // "forward" declaration only; no #include needed
class foo { widget *pwidget; ...}

现在,只有实现foo 的文件需要widget 的完整声明; foo 的客户包括"foo.h" 不需要它。

但现在foo 不再是widget 的一种,这对代码组织有影响。 foo 仍然有 widget 部分通过创建对象并持有它。如果widget 符合小部件的一些抽象接口,foo 可能能够实现它,并委托给包含的widget

另一个最小化依赖的工具是dependency inversion

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多