为什么从静态方法访问非静态方法是糟糕的设计

Why is accessing a non static method from static method is Bad design

我正在从静态方法访问非静态方法。下面是代码。我读了它糟糕的设计 source。为什么这个糟糕的设计请帮助我理解。 如果可以,如何实现。

#include<iostream>

class Base 
{
public :
    static Base* initialiser;
    void BaseMethod() 
    {
        std::cout<<"Non static method Invoked"<<std::endl;
    }

    static  Base* GetInstance() 
    {
        if (!initialiser)
            initialiser = new Base();

        return initialiser;
    }
};

Base* Base::initialiser = nullptr;

class Service 
{
public: 
    void ServiceMethod()
    {
        Base::GetInstance()->BaseMethod();
    }
};

int main()
{
     Service obj;
     obj.ServiceMethod();
}

由于问题是针对一般情况的,这里引用 Wikipedia:

Static methods are meant to be relevant to all the instances of a class rather than to any specific instance.

A static method can be invoked even if no instances of the class exist yet.

因此,您应该考虑将静态方法放在 class 命名空间中,用于在 class 上进行操作,而不是在 class 的 instances/objects 上操作。

在创建单例的情况下,您不是从静态方法访问非静态方法,而是在静态方法中初始化该(静态)对象的实例initialiser

Why is accessing a non static method from static method is Bad design

它本身不是,因为您实际上是在使用静态方法中的静态成员

然而,这段被剪掉的代码太死板了,太他妈的过度设计了。这意味着一旦新需求开始发挥作用,更有可能出现错误,变得一团糟。

  • 缺陷:此代码不是线程安全的。您应该实例化 initializer,而不是在 GetInstance 中,而是使用 Base* Base::initialiser{new Base()};,它保证从 c++11 开始是线程安全的。
  • 缺陷:像这样的 class 应该极其谨慎地导出。或添加 final 以防止这种可能性。
  • 设计:此代码仍然具有零行功能。你还在管道。您想重新考虑这是否是解决问题的最佳设计。
  • design : 目的是提供一个单例。我们开发者喜欢强制执行不必要的约束,例如唯一性。当需要在为单例设计的系统中支持两个实例时,我们必须重构很多东西。