c++ 我应该将一个只包含方法的类转换为名称空间中的自由函数吗?

e5nqia27  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(111)

我最初创建的类是这样的:

class A
{
  public:
   void run(int x);

  private:
   void run_helper1();
   void run_helper2();
   void run_helper3();

   int a_;
   double b_;
   bool c_;
};

后来我意识到它真的不需要任何状态,我只需要函数。删除类并在命名空间中创建这些自由函数有意义吗?如果是这样,我就失去了public和private的概念,如果我没记错的话,最后run_helper1()run_helper2()run_helper3()都是public。这看起来是一个糟糕的设计。

fiei3ece

fiei3ece1#

classnamespace之间的主要区别在于class是 * 封闭的 *(但是可以使用继承来扩展)并且保持 * 不变式 *;而 namespace 是 * 开放的 *,可以在任何地方扩展。Invariant可能就像拥有一个唯一的地址(并且能够比较示例地址)一样简单,但是,如果我理解正确的话,即使这样也是不必要的。
如果A除了“组合在一起”函数之外没有其他用途,那么您的直觉可能是正确的,您可能需要将其更改为名称空间。
然而,有一个namespace不能做而class可以做的例子:没有template命名空间。因此,如果你需要一起传递方法,例如作为一个API(或版本化API),那么你需要将它们保持为class。在这种情况下,被调用方模板覆盖整个函数集合,你可以有多个这样的集合;但这是一个相当罕见的用例。
因此,通常您可以转换它。

相关问题