Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在c+;中创建单例类时静态函数不能引用静态变量+;?_C++_Design Patterns_Singleton - Fatal编程技术网

C++ 为什么在c+;中创建单例类时静态函数不能引用静态变量+;?

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

我试图理解singleton设计模式,并创建了一个最简单的模式:

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