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