提问人:jlev 提问时间:12/3/2022 最后编辑:cigienjlev 更新时间:12/3/2022 访问量:78
我是否应该将仅包含方法的类转换为释放命名空间中的函数?
Should I convert a class with only methods to free functions in a namespace?
问:
我最初创建了一个这样的类:
class A
{
public:
void run(int x);
private:
void run_helper1();
void run_helper2();
void run_helper3();
int a_;
double b_;
bool c_;
};
后来我意识到它真的不需要任何状态,我只需要函数。删除类并在命名空间中创建这些免费函数是否有意义?如果是这样,如果我没记错的话,我失去了公共和私人的概念,最终得到了 , ,都是公共的。这似乎是一个糟糕的设计。run_helper1()
run_helper2()
run_helper3()
答:
2赞
lorro
12/3/2022
#1
和 之间的主要区别 a 是闭合的(但可能使用继承可以扩展)并保持不变性;而命名空间是开放的,可以随时扩展。不变性可能就像拥有一个唯一的地址(并且能够比较实例地址)一样简单,但是,如果我理解正确的话,即使这样也是不必要的。class
namespace
class
如果除了“组合”函数之外真的没有其他用途,那么您的直觉可能是对的,您可能希望将其更改为命名空间。A
但是,有一个例子是 a 不能做到的:没有命名空间。因此,如果您需要将这些方法一起传递,例如作为 API(或版本控制的 API),则需要将它们保留为 .在这种情况下,被调用方模板覆盖整个函数集合,您可以拥有多个这样的集合;但这是一个相当罕见的用例。namespace
class
template
class
因此,通常您可以转换它。
下一个:获取定义方法的类
评论
run()
run_helper()
static
this
namespace
namespace