多个小型函子类的共享头文件

Shared header file for multiple small functor classes?

本文关键字:共享 文件 子类 小型      更新时间:2023-10-16

我是一名新程序员,我遇到了需要创建一些(2-4)个与我的其他类密切相关的小函子类的情况。主类称为GraphicsRenderer,它本质上是OpenGL的包装器,将所有OpenGL API调用完全封装在一个编译单元中。因为所有的函子都只支持GraphicsRenderer类,所以我正在考虑在GraphicsRenderer.h头文件中声明它们。

我知道"规则"是每个头文件通常只有一个类声明。那么我应该在哪里声明函子..?

  • 为每个函子类创建单独的 .h 和 .cpp 文件?(所有这些都必须包含 API 调用。

  • 在与图形渲染器类相同的文件中声明/定义所有函子类?(这会将所有 API 调用保留在相同的编译单元中。

  • 或者这是命名空间的好地方?嵌套类声明(即:在 GraphicsRenderer 类声明中声明删除器函子)呢?

除了拥有更少的文件之外,您将每个类保存在单独的.h/.cpp文件中不会造成太大损失。我建议每个文件有一个类。

话虽如此,您仍然可以将头文件合并到一个包含所有其他.h文件的通用头文件中,这将使 API 用户更方便。假设您的GraphicsRenderer只能与函子一起使用,您甚至可以将它们的.h文件包含在GraphicsRenderer'h头文件中。

至于命名空间,不同的团队对它们有不同的约定。我更喜欢使用命名空间仅用于防止 API 冲突 - 我通常为大面积的内聚 API 保留单个命名空间。我见过其他团队的极端程度几乎每个类都有一个命名空间。

如果您的函子不是模板,请在 .h 文件中声明接口,如下所示:

文件 .h:

class GraphicsRenderer {
   void someApiCall();
   void someOtherApiCall();
};

用于实施的文件.cpp:

#include <GL.h>
GraphicsRenderer::SomeApiCall() {
    //Implementation goes here.
}

如果要将它们一起使用并且它们足够小,则将它们打包到单个头文件中没有问题。例如,stl 库有一个包含类集合的 utility 标头。

但是保持实现和接口尽可能分开,所以不要实现内联函数,在.cpp文件中实现它们,并尽可能摆脱 .h 文件中的#include,尽可能使用前向声明。这也缩短了编译时间。

例外情况是当您使用模板时,但即使您这样做,我也建议您像这样拆分文件:

在 MyFile.h 文件中:

template <class T>
class MyClass {
public:
   template <class U>
   void apiCall(U u);
};
#include "MyFilePriv.h"

MyFilePriv.h 与实现:

template <class T>
template <class U>
MyClass<T>::apiCall(U u) {
   //Implementation goes here.
}

即使模板不是用于单独编译的,这也使得读取接口文件变得更加容易,并且仍然隐藏了实现细节,至少对开发人员来说是这样。