crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

5 страниц V  < 1 2 3 4 > »   
Ответить в данную темуНачать новую тему
> Шаблон проектирования Singleton (одиночка), подбираю подходящий для моей задачи
ViGOur
  опции профиля:
сообщение 5.5.2008, 10:39
Сообщение #11


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Для этого и существуют такие директивы препороцессора как:
#ifndef _MYCLASS_H_
#define _MYCLASS_H_

class CMyClass{ ... };

#endif // _MYCLASS_H_
;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 и без подсчёта ссылок пишется.
Простейший:
struct singleton_t {
  static singleton_t& instance() {
    static singleton_t inst;
    return inst;
  }
  //Здесь пишем нужные методы
  private:
    singleton_t() {/*код инициализации*/}
    ~singleton_t() {/*код очистки*/}
    singleton_t(const singleton_t&);
    singleton_t& operator=(const singleton_t&);
};

Мне кажется, он хорошо подойдёт, т.к. те проблемы, которые он имеет, в данном случае не существенны.

Собственно проблемы:
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) *
operator=( const CSingleton&){}

Цитата(Tonal @ 5.5.2008, 15:02) *
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) *
хе, правильно хидер то один и тот же, туплю :)

Посмотри книгу 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) *
какую пользу она дает?
Этим мы просто говорим, что оператор присваивания нашего 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::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));


Если я ни где не создаю экземпляр класса QTextCodec, то можно ли пользоватся таким вариантом в место "одиночки"?
Правильно ли я понял, что "одиночка" спасает от "случайного" создания/удаления экземпляра?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.5.2008, 12:42
Сообщение #20


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Тот пример, что ты привел, обычная статическая функция.
Класс одиночка - это класс для которого можно создать только один объект...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

5 страниц V  < 1 2 3 4 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 8:27