Ми нещодавно обговорювали цю тему в моєму класі EECS. Якщо ви хочете детально ознайомитись із конспектами лекцій, відвідайте http://umich.edu/~eecs381/lecture/IdiomsDesPattsCreational.pdf
Я знаю два способи правильно створити клас Singleton.
Перший шлях:
Реалізуйте його аналогічно тому, як у своєму прикладі. Що стосується знищення, "Singletons зазвичай терпить протягом тривалості запуску програми; більшість ОС відновить пам'ять та більшість інших ресурсів, коли програма припиняється, тому є аргумент, щоб не турбуватися з цього приводу".
Однак, це є гарною практикою очищення після завершення програми. Тому ви можете зробити це за допомогою допоміжного статичного класу SingletonDestructor і оголосити про це як друга у своєму Singleton.
class Singleton {
public:
static Singleton* get_instance();
// disable copy/move -- this is a Singleton
Singleton(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton& operator=(Singleton&&) = delete;
friend class Singleton_destroyer;
private:
Singleton(); // no one else can create one
~Singleton(); // prevent accidental deletion
static Singleton* ptr;
};
// auxiliary static object for destroying the memory of Singleton
class Singleton_destroyer {
public:
~Singleton_destroyer { delete Singleton::ptr; }
};
Singleton_destroyer буде створений при запуску програми, і "коли програма припиняється, всі глобальні / статичні об'єкти знищуються кодом відключення бібліотеки виконання (вставлений лінкером), тому the_destroyer буде знищений; його деструктор видалить Singleton, запустивши його деструктор ".
Другий шлях
Це називається Майєрс Сінглтон, створений майстром C ++ Скоттом Мейерсом. Просто по-різному визначте get_instance (). Тепер ви також можете позбутися змінної члена вказівника.
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
Це акуратно, оскільки повернене значення є посиланням, і ви можете використовувати .
синтаксис замість ->
доступу до змінних членів.
"Компілятор автоматично створює код, який створює 's' перший раз через декларацію, а не після цього, а потім видаляє статичний об'єкт при завершенні програми."
Зауважте також, що з Меєром Сінглтон ви "можете потрапити в дуже складну ситуацію, якщо об'єкти покладаються один на одного в момент припинення - коли Синглтон зникає відносно інших об'єктів? Але для простих додатків це працює чудово".