C++-只有静态成员的类是不是不好的做法/反模式



关于只包含静态成员的类,我看到很多人声称这是一种糟糕的模式,而且它从来都不是解决问题的最佳方案。

在C++中,只有静态成员的实用程序类是一种反模式吗?主张使用名称空间,并通过声明得出结论

对我来说,最明显的答案是:因为我们不需要OO来实现这一点。

这对我来说很奇怪,原因有几个。他们似乎在谈论只包含静态成员函数的类,而不是包含静态数据和静态函数混合的类。只有静态成员函数的类确实可以用命名空间内的全局函数来替换,但如何用同时包含静态函数和静态数据的类来替换呢?

struct Foo
{
static void add5()
{
s_x += 5;
}
static const int& getX()
{
return s_x;
}
private:
static int s_x;
};
int Foo::s_x{ 0 };

命名空间中有函数和全局变量?如何确保s_x不能被外部代码直接访问和修改?

另一件让我困惑的事情是,我觉得只有静态成员的类在C++和库中很常见。

SFML的sf::Mouse只有静态成员。

游戏编程模式多次使用只有静态成员的类,甚至用术语"来指代它;静态类";在辛格尔顿一章中。服务定位器章节本质上是一个只有静态成员的类。

那么人们应该怎么想呢?只有静态成员的类是不是设计不好/实践不好?或者它们在某些情况下有自己的位置?

另一个问题的首要答案仍然存在:您不需要类来封装静态函数和静态变量。这可以通过名称空间来完成,也可以通过使用编译单元的范围来完成。

在您的示例中,如果您使用名称空间,则不需要公开私有静态数据成员的存在:

在标头中声明:

namespace Foo {
void add5();
const int& getX();
}

然后在cpp:中实现

namespace Foo
{
static int s_x{0};   // static globals are not visible outside the compilation unit
void add5()
{
s_x += 5;
}
const int& getX()
{
return s_x;
}
};

请注意:静态全局变量与静态成员并不完全相同,但在上面的代码中,它的效果与私有的效果相同。对于公共数据成员,只需删除关键字static即可。

虽然通常我也推荐名称空间,但在某些情况下,类显然是更好的方法。例如,您可以将类作为模板参数传递,这意味着您可以让策略类以不同的方式实现接口,并且;插入";。使用名称空间无法做到这一点。

但是,如果您不打算以这种方式引用名称组,我不建议将其作为组织代码的通用方法。

最新更新