Третий вариант кажется подходящим, но только кажется. Мы получим ошибку создания во время исполнения. Вот радость то, конструируем объект, а он нам исключения выбрасывает, мы об этом уже говорили в Шаге 12.

В общем, как водится, приходим к смарт-указателю. Конечно, переменную-член указателя на живой, натуральный объект объявляем статической. Но указатель-то инициализируется нулем, 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(). Код можно либо вставлять в каждое определение классов-одиночек, либо наследовать от базового класса и вести коллекцию одиночек. В любом случае, такое решение достаточно гибкое, чем объявление глобальных переменных.

Перейти на страницу:

Похожие книги