Если вы сделаете его глобальным объектом, то каждый сможет получить к нему доступ, и любой может использовать его, не вызывая getInstance()
.Если так, то какова цель getInstance()
тогда?В первый раз вы будете вызывать его для создания экземпляра, затем вам не нужно будет вызывать getInstance()
, поскольку после первого вызова вы можете напрямую использовать instance
.
A private
*Экземпляр 1008 * static дает вам больше контроля над тем, как к нему можно получить доступ: только путем вызова getInstance()
.
Теперь, почему вы получаете ошибку multiple definition of instance
при компиляции вашего кода?Это потому, что вы определили глобальный объект в самом файле заголовка, который включен в несколько файлов .cpp
.Это вызывает несколько определений объекта, по одному определению в каждой единице перевода (. obj
файл).
То, что вы на самом деле должны делать, это:
//Singleton.h
class Singleton
{
private :
Singleton();
Singleton(const Singleton &);
~Singleton();
static Singleton* instance; //declaration of static member!
public:
static Singleton* getInstance();
//..
};
И затем определитеstatic
член в файле .cpp
как:
//Singleton.cpp
Singleton *Singleton::instance = 0; //definition should go in .cpp file!
Singleton::Singleton() {}
Singleton* Singleton::getInstance()
{
if ( instance == 0 ) instance = new Singleton();
return instance;
}
//...