【问题标题】:Shared header file for multiple small functor classes?多个小型仿函数类的共享头文件?
【发布时间】:2013-11-05 05:59:56
【问题描述】:
我是一名新程序员,我遇到了一种情况,我需要创建一些 (2-4) 个与我的其他类密切相关的小型仿函数类。主要类称为 GraphicsRenderer,它本质上是 OpenGL 的包装器,将所有 OpenGL API 调用完全封装在单个编译单元中。因为所有函子仅存在于支持 GraphicsRenderer 类,我正在考虑声明它们在 GraphicsRenderer.h 头文件中..
我知道“规则”通常是每个头文件只有一个类声明。那么我应该在哪里声明仿函数呢?
为每个仿函数类制作单独的 .h 和 .cpp 文件? (所有这些都必须包含 API 调用..)
在与 GraphicsRenderer 类相同的文件中声明/定义所有仿函数类? (这将所有 API 调用保持在相同的编译单元内。。)
或者这是命名空间的好地方?那么嵌套类声明(即:在 GraphicsRenderer 类声明中声明删除器函子)呢?
【问题讨论】:
标签:
c++
class
oop
functor
【解决方案1】:
除了文件更少之外,将每个类保存在单独的.h/.cpp 文件中并不会造成太大损失。我建议每个文件有一个类。
话虽如此,您仍然可以将头文件组合成一个包含所有其他.h 文件的通用头文件,这将使 API 用户更方便。假设您的 GraphicsRenderer 只能与仿函数一起使用,您甚至可以将它们的 .h 文件包含到 GraphicsRenderer'h 头文件中。
对于命名空间,不同的团队有不同的约定。我更喜欢仅使用命名空间来防止 API 冲突——我通常为大面积的内聚 API 保留一个命名空间。我见过其他团队的极端情况,几乎每个类都有一个命名空间。
【解决方案2】:
如果您的函子不是模板,请在 .h 文件中声明接口,如下所示:
文件.h:
class GraphicsRenderer {
void someApiCall();
void someOtherApiCall();
};
文件 .cpp 用于实施:
#include <GL.h>
GraphicsRenderer::SomeApiCall() {
//Implementation goes here.
}
如果你打算一起使用它们并且它们足够小,那么将一些类打包在一个头文件中是没有问题的。例如,stl 库有一个带有类集合的 utility 标头。
但是尽量保持实现和接口分离,所以不要实现内联函数,在.cpp文件中实现,在.h文件中尽量去掉#includes,使用@987654321 @ 如果可能。这也缩短了编译时间。
使用模板时例外,但即使这样做,我建议您像这样拆分文件:
在 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.
}
即使模板不用于单独编译,这也使得读取接口文件变得更加容易,并且仍然隐藏了实现细节,至少对于开发人员而言。