3

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

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

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

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

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

4

2 回答 2

2

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

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

至于命名空间,不同的团队有不同的约定。我更喜欢仅使用命名空间来防止 API 冲突——我通常为大面积的内聚 API 保留一个命名空间。我见过其他团队的极端情况,几乎每个班级都有一个命名空间。

于 2013-11-05T06:07:06.287 回答
1

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

文件.h:

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

用于实施的文件 .cpp:

#include <GL.h>

GraphicsRenderer::SomeApiCall() {
    //Implementation goes here.
}

如果您要一起使用它们并且它们足够小,那么将某些类打包在一个头文件中是没有问题的。例如,stl 库有一个utility包含类集合的标题。

但是尽量保持实现和接口分离,所以不要实现内联函数,在文件中实现,在.h文件中尽量.cpp去掉#includes,尽可能使用前向声明。这也缩短了编译时间。

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

在 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.
}

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

于 2013-11-05T06:11:56.747 回答