多个小型仿函数类的共享头文件?

时间:2013-11-05 05:59:57

标签: c++ class oop functor

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

我知道'规则'通常每个头文件只有一个类声明..所以我应该在哪里声明这些仿函数..?

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

  • 在与GraphicsRenderer类相同的文件中声明/定义所有仿函数类? (这使得所有API调用保持在相同的编译单元中。)

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

2 个答案:

答案 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.
}

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