【问题标题】:Should I use header files in this specific situation?我应该在这种特定情况下使用头文件吗?
【发布时间】:2013-01-21 23:00:00
【问题描述】:

我的应用程序由几个组件组成,继承自一个抽象基类。除了这两个被每个组件覆盖的成员函数之外,没有任何组件有任何公共声明。

class Component()
{
public:
    virtual void Init() = 0;
    virtual void Update() = 0;
};

既然没有其他公共方法或成员,那么创建头文件有意义吗?这可以节省编译时间还是有其他方法可以做到这一点?

【问题讨论】:

  • 您发布的课程是一个非常愚蠢的想法。
  • @Pubby:你为什么这么说?
  • “Init”成员函数绝不是一个好主意
  • public Init 成员总是不好的。
  • 这似乎不仅是一个大体上无用的界面,而且还是一个促进积极有害设计的界面。

标签: c++ compilation header-files


【解决方案1】:

如果您不在单个 CPP 文件之外使用该类,则不需要标头。否则,您可以避免编写头文件,风险自负:潜在的损失(基类的不一致重新声明)远远超过潜在的胜利(加快编译时间)。整个项目的可读性也会受到影响 - 您项目的其他读者会期望在那里看到一个标题,并且会惊讶地看到不同文件中的多个副本。

【讨论】:

    【解决方案2】:

    如果你有很多派生自Component 的派生类,你可以把它放在一个单独的头文件中:IComponent.hI 表示接口,它是 C++ 中的抽象类。这使得代码结构非常清晰。

    您的代码有 UB,因为您尚未为抽象类定义 virtual destructor

    class Component()
    {
    public:
        virtual ~Component();      
        virtual void Update() = 0;
    };
    

    如果通过指向基类的指针删除派生类型的对象,则会得到未定义的行为。

    也正如@Griwes 指出的那样,只需使用构造函数来初始化成员,不需要有多余的virtual Init 函数。

    【讨论】:

    • 谢谢,我不知道。在我的特殊情况下,不会删除任何组件指针(在退出应用程序之前)。但无论如何我会更新我的源代码。
    • 现在,添加一些关于“Init() 是愚蠢的,因为在 C++ 中你有它的构造函数”,我会支持你。
    • 定义类不会产生未定义的行为。也不是从那个类派生的。如果通过指向基类的指针删除派生类型的对象,则会得到未定义的行为。
    • @PeteBecker 完全正确。我的回答中有这个:If you use Component pointer to hold a derived object and delete the pointer, it's undefined behavior.,但我喜欢你的话,我会把它放在我的回答中。
    • @Griwes。遗憾的是,我认为我不能在这个用例中使用构造函数,因为我需要先初始化基类的受保护成员。我真的很想改进我的系统,如果可能的话使用构造函数。但由于这实际上与此处无关,因此我发布了another question
    【解决方案3】:

    不,不需要写头文件。

    【讨论】:

      【解决方案4】:

      这完全取决于您如何使用课程。如果您只在一个源文件中使用派生类,则没有特别的理由使用头文件。

      我不会担心编译时间,除非您运行在 10 年以上的机器上。现代机器很好地缓存磁盘读取,您很可能会包含几兆字节的其他头文件。

      但是,如果您想在其他项目中“重用”您的课程,那么您现在已经很难做到了。

      【讨论】:

      • 所有组件仅包含在一个文件中,其中每个类的实例存储在向量中。然后Update() 经常在向量上被调用。编译时间很困扰我,因为每次大约需要 30 秒。
      • 我认为这是编译一个相当大的项目的总编译时间。一个头文件不会对编译时间产生实质性的改变。
      【解决方案5】:

      创建标头通常是一个好主意,即使对于性能提升不会很显着的小程序也是如此。这是您应该养成的良好编码习惯! :)

      http://www.cplusplus.com/forum/articles/10627/

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 2022-07-22
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 2010-09-05
        • 2017-05-09
        相关资源
        最近更新 更多