【发布时间】:2022-12-10 01:26:41
【问题描述】:
我试图通过以下代码了解引擎盖下发生的事情。我遇到的问题是:如何在 C++ 中处理类的静态实例?
#include <iostream>
using namespace std;
class Shape {
public:
static Shape& getInstance() {
static Shape obj;
static Shape& objRef = obj;
return objRef;
}
void init() {
Shape singleton = Shape::getInstance();
srand((unsigned)time(0));
singleton.width = rand()%100;
singleton.printWidth();
}
void printWidth(){
cout<<width<<endl;
}
protected:
int width = 0;
};
int main()
{
Shape rectangle;
rectangle.init();
rectangle.printWidth();
return 0;
}
此代码的输出是:
37
0
但对我来说,这没有意义。如果在程序中的任何地方都创建了 Shape 的静态实例,那么内存中不应该只有一个 Shape 吗?如果在单例设置宽度后任何形状调用printWidth,它们的宽度不应该等于那个宽度吗?
如果能解释我的想法哪里出了问题,我将不胜感激。
【问题讨论】:
-
你的
shape类不是单身人士。单例具有私有构造函数,因此只有get_instance函数可以为您提供单个对象的句柄。 -
getInstance返回副本,而不是参考。这里面的逻辑也很奇怪。您可能会通读 C++ Singleton design pattern 以获取有关如何正确实现此功能的一些信息。 -
“记忆中的Shape不应该只有一个吗?”不知道你为什么这么想。 main 中的第一行创建了一个实例,
getInstance中有一个静态实例,你在init中复制它 -
static Shape obj;<--- 这是内存中只存在一次的实例,无论调用该函数的频率如何。 -
我建议你写一个构造函数
Shape() { std::cout << "Hello WOrld"; }和一个析构函数~Shape() { std::cout << "Bye!"; }来更好地了解创建了多少实例
标签: c++ class static singleton