为什么从静态方法访问非静态方法是糟糕的设计
Why is accessing a non static method from static method is Bad design
>我正在从静态方法访问非静态方法。下面是代码。我读了它糟糕的设计来源。为什么这个糟糕的设计请帮助我理解。 如果是这样,如何实现它。
#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();
}
为什么从静态方法访问非静态方法是 糟糕的设计
它本身不是,因为您实际上是在使用静态方法中的静态成员
然而,这个被剪掉的代码太死板了,太该死的过度设计了。这意味着一旦新要求发挥作用,更有可能出现错误,变得一团糟。
- 缺陷:此代码不是线程安全的。你应该实例化
initializer
而不是在GetInstance
,而是使用Base* Base::initialiser{new Base()};
,这保证在 c++11 中是线程安全的。 - 缺陷:像这样的类应该非常谨慎地派生。或者添加
final
以防止这种可能性。 - 设计:此代码的功能仍然为零行。你还在管道。您需要重新考虑这是否是要解决的问题的最佳设计。
- 设计:目的是提供一个单例。我们喜欢强制实施不必要的约束,例如唯一性。当需要在为单例设计的系统中支持两个实例时,我们必须重构很多东西。
由于这个问题是针对一般情况的,以下是维基百科的引述:
静态方法旨在与类的所有实例相关,而不是与任何特定实例相关。
即使尚不存在该类的实例,也可以调用静态方法。
因此,您应该将静态方法视为类命名空间中,用于对类而不是对类的实例/对象进行操作。
在创建单例的情况下,您不是从静态方法访问非静态方法,而是在静态方法中初始化该(静态)对象的实例initialiser
。
相关文章:
- 如何从C 的朋友类访问私有静态方法
- 为什么从静态方法访问非静态方法是糟糕的设计
- 无法访问静态方法(C )
- 测试项目在访问私有静态方法时遇到问题,尽管我从未直接调用过它
- 如何在C++的静态方法中访问非静态引用
- 通过传递的指针在静态方法中访问非静态成员
- "undefined reference"从静态方法访问的模板类的静态成员
- 类静态方法访问其静态数据成员
- 从静态方法访问非静态成员的工作示例
- C++ Lambda:访问 lambda 中的静态方法会导致错误'this was not captured for this lambda function'
- 通过非静态方法访问静态成员
- 如何从静态方法(信号处理程序)访问类成员和方法
- 无法访问公共静态方法
- 该"Named Constructor Idiom"似乎与静态方法无法访问非静态成员函数的规则相矛盾。有什么解释吗?
- 访问其他类中的静态方法和静态布尔值
- 从静态方法访问对象的属性
- 从c++类外部访问私有静态方法
- 从c++的静态方法中访问#defined变量
- 如何在c++中使用ref类从线程中访问非静态方法
- 静态方法可以访问同一类的私有方法吗?