Для начала я думаю:
singleton();
должно быть:
instance = new singleton();
Как у вас есть, вы на самом деле не храните вновь созданный объект, поэтому instance
будет всегда быть нулевым.
Это также хорошая форма для явной установки статики с помощью:
singleton *singleton::instance = 0;
(вне определения класса).
На самом деле, возможно, лучше начать с базового одноэлементного кода и продолжить свой путь оттуда. Это версия указателя стандартной формы:
#include <iostream>
class singleton {
protected:
static singleton *instance;
singleton() { }
public:
static singleton *getInstance() {
if (instance == 0)
instance = new singleton();
return instance;
}
};
singleton *singleton::instance = 0;
int main() {
singleton *s1 = singleton::getInstance();
singleton *s2 = singleton::getInstance();
std::cout << s1 << '\n';
std::cout << s2 << '\n';
return 0;
}
Вы видите, что оба указателя совпадают с выводом:
0xbc0358
0xbc0358
Или эталонная версия, поскольку, похоже, вы на это нацелены:
#include <iostream>
class singleton {
protected:
static singleton *instance;
singleton() { }
public:
static singleton& getInstance() {
if (instance == 0)
instance = new singleton();
return *instance;
}
};
singleton *singleton::instance = 0;
int main() {
singleton &s1 = singleton::getInstance();
singleton &s2 = singleton::getInstance();
std::cout << &s1 << '\n';
std::cout << &s2 << '\n';
return 0;
}