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

标签 c++ class static

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

Are utility classes with nothing but static members an anti-pattern in C++? 上接受并投票最多的答案提倡使用命名空间,并以声明结束

the most obvious answer to me is: Because we don't need OO to achieve this.

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

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++ 书籍和库中很常见。

SFMLsf::Mouse只有静态成员。

Game Programming Patterns多次使用只有静态成员的类,甚至在 Singleton chapter 中使用术语“静态类”来引用它.和 Service Locator chapter本质上是一个只有静态成员的类。

那么应该怎么想呢?只有静态成员的类是糟糕的设计/糟糕的做法吗?或者他们在某些情况下有自己的位置吗?

最佳答案

另一个问题的最佳答案仍然成立:您不需要类来封装静态函数和静态变量。这可以通过命名空间来完成,并且——稍微遵守一下——使用编译单元的范围。

在您的示例中,如果您使用命名空间,则无需公开私有(private)静态数据成员的存在:

在标题中声明:

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;
    }
};

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

关于C++ - 只有静态成员的类是不好的做法/反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70356582/

相关文章:

C++ 继承 - 从构造函数调用重写

c++ - 编译器生成的复制构造函数的线程安全

c++ - 让 GNU 使用不同的编译器

java - 在另一个类的方法中使用驱动程序类中的变量 (java)

php - 创建一个新的被调用类而不是父类的实例

c++ - 在 Netbeans 中配置 C++11

python - 为什么使用 classmethod 而不是 staticmethod?

javascript - 'class' 语法在 javascript 中如何工作?

java - 垃圾收集器是否处理 java 中的静态变量或方法?

C++ 指针查询