Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализация "Синглтона"  (Прочитано 9410 раз)
0 Пользователей и 1 Гость смотрят эту тему.
SSW
Гость
« : 10-12-2004 12:07 » 

Интересует как пример, сам Singleton сервер, и клиент которий бы с ним работал. (вне процессный).

Зарание спасибо.
Записан
baldr
Команда клуба

ru
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 10-12-2004 13:06 » 

Код:
class myclass
{
private:
static myclass *_self;
myclass();
public:
static myclass* Instance() {
if (_self==NULL) _self=new myclass;
return _self;
}

};
myclass *myclass::_self=NULL;
« Последнее редактирование: 03-12-2007 16:40 от Алексей1153++ » Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
SSW
Гость
« Ответ #2 : 11-12-2004 10:22 » 

Млин! Чето я не могу разобраться. Может примерчик есть ?
Записан
baldr
Команда клуба

ru
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 11-12-2004 10:34 » 

Да чего тут разбираться... Просто получаешь ссылку на него так:
Код:
myclass* coolclass=NULL;

void mycoolfunction()
{
  coolclass=myclass::Instance();
}
Вот так. И потом у тебя эта ссылка нормально работает. И в пределах области жизни статической переменной myclass::_self у тебя будет только один экземпляр класса myclass.  8)
« Последнее редактирование: 03-12-2007 16:40 от Алексей1153++ » Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Serega
Гость
« Ответ #4 : 12-12-2004 08:55 » 

Насколько я понял интересует как это сделать в COM,
смотри с сторону CComObjectGlobal, если пишеш на ATL
либо как показал baldr, если CreateInstance пишеш сам
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #5 : 24-12-2004 19:37 » 

static myclass* Instance() {
if (_self==NULL) _self=new myclass;
return _self;
}
- а как насчет удаления _self?

Может лучше:
static myclass* Instance()
{
  static myclass self;
  return &self;
}
Тогда переменная _self - не нужна, и утечки памяти нет.
Записан
Serega
Гость
« Ответ #6 : 24-12-2004 23:47 » 

Это вариант, но тут возникает другая проблема
если важна последовательность создания синглетонов то такая реализация не пойдет
как избежать утечки памяти и управлять временем жизни синглетонов написано у Александреску в Modern C++ Design
Записан
baldr
Команда клуба

ru
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #7 : 25-12-2004 09:00 » 

Сейчас не помню правильный способ, но очевидным кажется подсчет числа ссылок на объект.
Например, можно перегрузить оператор new и delete - и при каждом удалении уменьшать счетчик. При достижении нуля - удалять.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
ysv_
Помогающий

ua
Offline Offline

« Ответ #8 : 26-12-2004 19:46 » 

Это вариант, но тут возникает другая проблема
если важна последовательность создания синглетонов то такая реализация не пойдет
Почему? Если важна последовательность создания, то надо обеспечить необходимую последовательность вызовов методов Instance соответствующих классов. А этого можно достичь, причем несколькими вариантами.
« Последнее редактирование: 26-12-2004 19:48 от ysv_ » Записан
Serega
Гость
« Ответ #9 : 26-12-2004 20:39 » 

Статические переменные инициализируются так, как захочет компилятор (почти верно)
Поэтому не важно в какой последовательности ты вызываешь Instance
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #10 : 29-12-2004 22:35 » new

Пока что, во всех компиляторах, какими я пользовался статические переменные инициализируются при первом обращении к ним, т.е. при при первом вызове функции, в которой они объявлены. Подозреваю, что такое поведение гарантируется стандартом.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines