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抽象类相同的代码.
有什么想法吗?
这不是必需的.这基本上是一个判断电话.
如果每个类的实现都很简单,你可以将它们全部放在一个.h和一个.cpp中
如果实现有点长,那么为每个实现使用单独的.h和.cpp文件可能更简洁.
为每个类使用不同的.h/.cpp的一些优点:
根据设计的其余部分,您可能会考虑一个工厂,其中您的抽象类具有一个静态方法(或多个静态方法,具体取决于您如何实现它),该方法构造适当的子类并将其作为 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 提到的编译器优势。您可以如上所述在头文件中内联子类定义,但这并不能真正为您带来任何好处。当涉及到内联等优化时,您的编译器通常比您更聪明。