For a start, I think:
singleton();
should be:
instance = new singleton();
The way you have it, you're not actually storing the newly instantiated object so instance
will always be null.
It's also good form to explicitly set statics with:
singleton *singleton::instance = 0;
(outside the class definition).
In fact, it's possibly better to start with the baseline singleton code and work your way up from there. This is a standard-form pointer version:
#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 << '
';
std::cout << s2 << '
';
return 0;
}
You can see that both pointers are the same from the output:
0xbc0358
0xbc0358
Or the reference version, since that seems to be what you're aiming for:
#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 << '
';
std::cout << &s2 << '
';
return 0;
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…