В общем, как водится, приходим к смарт-указателю. Конечно, переменную-член указателя на живой, натуральный объект объявляем статической. Но указатель-то инициализируется нулем, NULL. Это потом конструктору передать можно какие угодно параметры. Далее нужно определить статическую функцию, которая при первом обращении создает одинокий объект, а потом возвращает указатель на него. Нужно еще определить так же и разрушающую функцию; проблема будет в том, когда ее вызвать. Теперь можно создавать море смартов - реально они будут указывать на единственный объект. Код для такого способа уже незачем писать.
Зато интересно сделать вот что: пусть класс одинокого устройства будет смарт-указателем на самого себя[1]!
class CSingleton {
public:
static CSingleton* GetInstance (void);
static void DestroyInstance (void) {
if (m_instance) delete m_instance;
}
private:
static CSingleton* m_instance;
protected:
CSingleton {}
};
CSingleton* CSingleton::m_instance = NULL;
CSingleton* CSingleton::GetInstance {
if (!m_instance) m_instance = new CSingleton;
return m_instance;
}
Здесь доступ к единичному экземпляру осуществляется исключительно через статическую функцию GetInstance. Код можно либо вставлять в каждое определение классов-одиночек, либо наследовать от базового класса и вести коллекцию одиночек. В любом случае, такое решение достаточно гибкое, чем объявление глобальных переменных.