具体类的单独头文件 - C++

Nav*_*K N 5 c++ abstract-class header-files

背景

我有一个抽象类,类似于

class IConverter{
    public:
    virtual void DoConvertion() = 0;
};
Run Code Online (Sandbox Code Playgroud)

将有许多具体的类只是实现DoConvertion方法.

class TextConverter : public IConverter{
    public:
    virtual void DoConvertion(){
         // my code goes here
     }
};

class ImageConverter : public IConverter{
    public:
    virtual void DoConvertion(){
         // my code goes here
     }
};
Run Code Online (Sandbox Code Playgroud)

这样会有很多具体的实现.我创建了一个头文件,比如说CharacterConverter.h,它有一个抽象类IConverter.

由于我的具体类只实现了DoConvertion方法,是否需要为每个具体类创建单独的头文件?我的意思是它需要为所有具体类创建ImageConverter.h,TextConverter.h等等吗?所有这些头文件都将包含与IConverter抽象类相同的代码.

有什么想法吗?

Bri*_*ndy 8

这不是必需的.这基本上是一个判断电话.

如果每个类的实现都很简单,你可以将它们全部放在一个.h和一个.cpp中

如果实现有点长,那么为每个实现使用单独的.h和.cpp文件可能更简洁.

为每个类使用不同的.h/.cpp的一些优点:

  • 它将保持代码整洁有序
  • 减少编译工作:其中一个实现的更改不需要重新编译所有其他实现
  • 更快的编译时间:一些编译器可以一次编译多个文件,例如Visual Studio的/ MP开关.使用多个文件,您将获得更快的编译时间.
  • 其他文件只能包含他们需要的内容而不是所有内容
  • 更快的链接时间:由于增量链接,链接时间将减少
  • 使用版本控制,您可以仅回顾对特定派生类的更改,而不必对大量1 .h/.cpp文件进行所有更改,以查找特定派生类中的一个更改.


mby*_*215 1

根据设计的其余部分,您可能会考虑一个工厂,其中您的抽象类具有一个静态方法(或多个静态方法,具体取决于您如何实现它),该方法构造适当的子类并将其作为 IConverter* 返回。这样,您可以仅公开头文件中的抽象定义,并将所有具体类定义和实现以及超类实现一起放在单个 .cpp 文件中。如果您的子类很大,这会有点麻烦,但对于较小的类,它会减少您必须管理的文件数量。

但是,正如其他人指出的那样,这最终是一个判断。唯一的性能问题与编译有关;更多的 cpp 文件可能需要(稍微)更长的时间来编译,更多的头文件可能会增加依赖性分析。但不要求每个头文件都有匹配的 cpp,反之亦然。

根据评论,我推荐这样的结构:

IConverter.h ==> IConverter 的定义 Converters.h
==> 所有子类
IConverter.cpp 的定义 ==> 包含 IConverter.h 和 Converters.h,包含 IConverter 抽象功能的实现(静态工厂方法和任何可继承功能)
.cpp、ImagerConverter.cpp等==>每个子类都有单独的cpp文件,每个文件包含IConverter.h和Converters.h

这允许您仅在使用工厂和通用功能的任何客户端中包含 IConverter.h。将所有其他定义放在一个标头中可以让您合并(如果它们基本相同)。单独的 cpp 文件允许您利用 Brian 提到的编译器优势。您可以如上所述在头文件中内联子类定义,但这并不能真正为您带来任何好处。当涉及到内联等优化时,您的编译器通常比您更聪明。