Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
ViGOur |
5.5.2008, 10:39
Сообщение
#11
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40
|
Для этого и существуют такие директивы препороцессора как:
|
|
|
|
|
Litkevich Yuriy |
5.5.2008, 10:42
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
хе, правильно хидер то один и тот же, туплю
|
|
|
|
|
Tonal |
5.5.2008, 11:02
Сообщение
#13
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17
|
Обычно синглетон (одиночка) без FreeInstance и без подсчёта ссылок пишется.
Простейший: Мне кажется, он хорошо подойдёт, т.к. те проблемы, которые он имеет, в данном случае не существенны. Собственно проблемы: 1) Возможные гонки потоков при создании. Решаются или более хитрым методом instance - с правильными блокировками, или принудительным созданием до запуска потоков. 2) Обращение к разрушенному объекту. Когда кто-нибудь пытается обратится к instance, когда inst уже разрушен. Т.к. разрушается экземпляр такого одиночки после выхода из main, то такое может происходить, только если обращение идёт из деструкторов других глобальных объектов. Решение - или запретить такие обращения, или создавать одиночку в куче и никогда не убивать (хорошо описано у Александреску). 3) Неясный порядок разрушения. Когда такой одиночка захватывает ресурсы время жизни которых завязано на другие ресурсы, неподконтрольные одиночке - например он держит открытый запрос, а конектом к базе занимается приложение. Решение - не делать так! Другое решение - предоставить метод очистки, который должен вызываться перед закрытием коннекта к базе. После закрытия, или возвращать признак ошибки, либо брасать исключение (может быть опасно если вылетит в деструкторе), либо возвращать заглушки. Сообщение отредактировал Tonal - 5.5.2008, 11:04 |
|
|
|
|
Litkevich Yuriy |
5.5.2008, 11:12
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
а зачем вот эта строка:
Цитата(ViGOur @ 5.5.2008, 1:12) Link operator=( const CSingleton&){} Цитата(Tonal @ 5.5.2008, 15:02) Link singleton_t& operator=(const singleton_t&); , какую пользу она дает? |
|
|
|
|
Andrew Selivanov |
5.5.2008, 11:19
Сообщение
#15
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: 6
|
Цитата(Litkevich Yuriy @ 5.5.2008, 11:42) Link хе, правильно хидер то один и тот же, туплю Посмотри книгу Modern C++ Design: Generic Programming and Design Patterns Applied By Andrei Alexandrescu. Там все очень хорошо про singleton-ы и прочие шаблоны расписано. О, оказывается она у меня есть на русском |
|
|
|
|
Litkevich Yuriy |
5.5.2008, 11:25
Сообщение
#16
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
у меня есть Эрих Гамма, там тоже есть примеры, но пока для меня это ново и требует время на переваривание, тем более, что я незнаю как лучше применить этот шаблон, толи сделать его универсальным, в отдельном модуле в виде шаблонного класса, и потом делать от него наследование, либо сделать класс только для моей задачи, но если мне опять понадобится "одиночка" писать заново.
|
|
|
|
|
ViGOur |
5.5.2008, 11:44
Сообщение
#17
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40
|
Цитата(Litkevich Yuriy @ 5.5.2008, 12:12) Link какую пользу она дает? Этим мы просто говорим, что оператор присваивания нашего Singleton'a закрытый, чтобы небыло неправомерной раздачи ссылок на него.Как ты мог заметить также закрытыми созданы: конструктор, деструктор, и конструктор копирования. |
|
|
|
|
Litkevich Yuriy |
5.5.2008, 11:45
Сообщение
#18
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
да, про конструктор/деструктор я понял, это чтоб никто не мог создать дубликат
|
|
|
|
|
Litkevich Yuriy |
5.5.2008, 12:29
Сообщение
#19
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Например, в Qt'ях я применяю такую строку:
Если я ни где не создаю экземпляр класса QTextCodec, то можно ли пользоватся таким вариантом в место "одиночки"? Правильно ли я понял, что "одиночка" спасает от "случайного" создания/удаления экземпляра? |
|
|
|
|
ViGOur |
5.5.2008, 12:42
Сообщение
#20
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40
|
Тот пример, что ты привел, обычная статическая функция.
Класс одиночка - это класс для которого можно создать только один объект... |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 26.12.2025, 0:48 |