【问题标题】: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.
      }
      

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

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2021-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多