Почему статическая функция не может ссылаться на статическую переменную при создании синглтон-класса в 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 ответа
Я что-то здесь упускаю?
Да, несколько вещей:
- Как уже упоминалось, вам не хватает определения статического
mySingleton
переменная указателя. Ваш код не является потокобезопасным
Правильный способ реализовать это - использовать локальную статическую переменную вgetInstance()
Функция (он же Скотт Мейер Синглтон):static mySingleton* getInstance(){ static mySingleton theInstance; return &theinstance; }
Эта реализация гарантированно является поточно-ориентированной, и вам не нужно беспокоиться о распределении памяти.
Использование указателя, вероятно, не то, что вы хотите в качестве типа возврата
static mySingleton& getInstance(){ // ^ static mySingleton theInstance; return theinstance; }
static mySingleton *ptr;
внутри определения класса просто декларация. Это не определение. Вы должны определить это используя:
mySingleton * mySingleton::ptr = nullptr;
вне определения класса.