Почему статическая функция не может ссылаться на статическую переменную при создании синглтон-класса в C++?

Я пытался понять шаблон проектирования синглтона и создал самый простой:

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

Когда я пытаюсь скомпилировать, я получаю:

Undefined symbols for architecture x86_64:
"mySingleton::ptr", referenced from:
    mySingleton::getInstance()       in ccm822LI.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

Почему я не могу использовать ptr внутри статической функции, так как ptr также является статической переменной? Я что-то здесь упускаю?

2 ответа

Решение

Я что-то здесь упускаю?

Да, несколько вещей:

  1. Как уже упоминалось, вам не хватает определения статического mySingleton переменная указателя.
  2. Ваш код не является потокобезопасным
    Правильный способ реализовать это - использовать локальную статическую переменную в getInstance() Функция (он же Скотт Мейер Синглтон):

    static mySingleton* getInstance(){
        static mySingleton theInstance;
        return &theinstance;
    }
    

    Эта реализация гарантированно является поточно-ориентированной, и вам не нужно беспокоиться о распределении памяти.

  3. Использование указателя, вероятно, не то, что вы хотите в качестве типа возврата

    static mySingleton& getInstance(){
                   // ^
        static mySingleton theInstance;
        return theinstance;
    }
    
static mySingleton *ptr;

внутри определения класса просто декларация. Это не определение. Вы должны определить это используя:

mySingleton * mySingleton::ptr = nullptr;

вне определения класса.

Другие вопросы по тегам