C++ 为什么在c+;中创建单例类时静态函数不能引用静态变量+;?
我试图理解singleton设计模式,并创建了一个最简单的模式:C++ 为什么在c+;中创建单例类时静态函数不能引用静态变量+;?,c++,design-patterns,singleton,C++,Design Patterns,Singleton,我试图理解singleton设计模式,并创建了一个最简单的模式: #include <iostream> class mySingleton{ private: static mySingleton *ptr; mySingleton(){ } public: static mySingleton* getInstance(){ if(!ptr){ ptr = new mySingleton(); retur
#include <iostream>
class mySingleton{
private:
static mySingleton *ptr;
mySingleton(){ }
public:
static mySingleton* getInstance(){
if(!ptr){
ptr = new mySingleton();
return ptr;
} else return ptr;
}
void msg(){
std::cout << " Hello World!! " << std::endl;
}
};
int main(){
mySingleton* obj = mySingleton::getInstance();
mySingleton* obj2 = mySingleton::getInstance();
return 0;
}
既然ptr也是一个静态变量,为什么不能在静态函数中使用ptr呢?我是不是遗漏了什么
static mySingleton *ptr;
类定义内部只是一个声明。这不是一个定义。您需要使用以下方法定义它:
mySingleton * mySingleton::ptr = nullptr;
在类定义之外
我是不是遗漏了什么
是的,有几件事:
mySingleton
指针变量的定义正确的实现方法是在
getInstance()
函数(aka.)中使用局部静态变量:
这个实现保证是线程安全的,您不需要为内存分配操心static mySingleton& getInstance(){
// ^
static mySingleton theInstance;
return theinstance;
}
@所以我不能在类static mySingleton*ptr=nullptr;内定义ptr。。因为当我这样做时,我会得到编译错误。@Pocke,但它甚至不必是静态成员。它可以是
getInstance
函数中的一个静态变量。@pocke甚至不必是指向动态分配对象的指针:-)谢谢你的回答。。我最后想做的事是。。因此可以多次调用getInstance()。。。但是为什么它实例化的对象总是相同的。。我知道这是因为静电,但我仍然缺少一些我需要的东西understand@pokche对getInstance()
的第一次调用将触发创建实例,以下任何调用都将获得与第一次调用相同的结果。。我知道一定会发生这样的事。。。但是你解释得很清楚。。。谢谢:)
static mySingleton* getInstance(){
static mySingleton theInstance;
return &theinstance;
}
static mySingleton& getInstance(){
// ^
static mySingleton theInstance;
return theinstance;
}