我是新的程序员,我遇到了一个需要创建一些(2-4)小型仿函数的情况,这些类与我的其他一个密切相关类。主类称为GraphicsRenderer,它本质上是OpenGL的包装器,完全封装了单个编译单元中的所有OpenGL API调用。因为所有的仿函数只存在以支持GraphicsRenderer类,所以我在考虑声明它们在GraphicsRenderer.h头文件中..
我知道'规则'通常每个头文件只有一个类声明..所以我应该在哪里声明这些仿函数..?
为每个仿函数类创建单独的.h和.cpp文件? (所有这些都必须包含API调用..)
在与GraphicsRenderer类相同的文件中声明/定义所有仿函数类? (这使得所有API调用保持在相同的编译单元中。)
或者这是命名空间的好地方吗?嵌套类声明怎么样(即:在GraphicsRenderer类声明中声明删除函子)?
答案 0 :(得分:2)
除了拥有较少的文件外,您还不会因为将每个课程保存在单独的.h
/ .cpp
文件中而损失太多。我建议每个文件有一个类。
话虽如此,您仍然可以将头文件合并到一个包含所有其他.h
文件的公共头文件中,这样可以使API用户更方便。假设您的GraphicsRenderer
仅适用于仿函数,您甚至可以将.h
个文件包含在GraphicsRenderer'h
标题文件中。
对于命名空间,不同的团队对它们有不同的约定。我更喜欢使用名称空间来防止API冲突 - 我通常为大范围的内聚API保留一个名称空间。我见过其他团队每个班级几乎都有一个名称空间。
答案 1 :(得分:1)
如果您的仿函数不是模板,请在.h文件中声明接口,如下所示:
档案.h:
class GraphicsRenderer {
void someApiCall();
void someOtherApiCall();
};
文件.cpp实现:
#include <GL.h>
GraphicsRenderer::SomeApiCall() {
//Implementation goes here.
}
如果您要将它们一起使用并且它们足够小,那么在单个头文件中打包某些类没有问题。例如,stl库有一个带有类集合的utility
标头。
但是保持实现和接口尽可能分离,所以不要实现内联函数,在.cpp
文件中实现它们并尽可能地去除.h文件中的#include
,尽可能使用forward declarations。这也可以缩短编译时间。
例外情况是您使用模板,但即使您这样做,我建议您拆分这样的文件:
在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.
}
即使模板不是用于单独编译,这也使得读取接口文件变得更加容易,并且仍然隐藏了实现细节,至少对于开发人员而言。