Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.64
DiabloRossi
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 49
#1

Синглтон - C++

08.03.2011, 22:32. Просмотров 3324. Ответов 14
Метки нет (Все метки)

необходимо разработать класс, который бы гарантировал, что его экземпляр будет один и только один из объектов данного класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
08.03.2011, 22:41     Синглтон #2
Это называется паттерн проектирования Одиночка(Singleton) - скачай книгу Э.Гамма, Хелм, Джонсон, Влиссидес "Приемы объектно-ориентированого проектирования" раздел "Порождающие паттерны". Там есть то, что тебе нужно
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.03.2011, 22:45     Синглтон #3
Ну или простенько.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdexcept>
 
class Single {
 public:
  Single() {
    if (am_i_running)
      throw std::domain_error("This object can have "
                              "only one instance.");
    am_i_running = true;
  }
  ~Single() {
    am_i_running = false;
  }
 private:
  static bool am_i_running;
};
 
bool Single::am_i_running = false;
 
int main(int argc, char *argv[]) {
  Single a;
};
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2011, 22:55     Синглтон #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Singleton
{
public:
  static Singleton* instance()
  {
     if( !m_this )
     {
          m_this = new Singleton();
      }
      return m_this;
   }
private:
  Singleton(){}
  static Singleton* m_this;
};
 
Singleton* Singleton::m_this = 0;
 
int main()
{
  Singleton* s = Singleton::instance();
}
DiabloRossi
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 49
08.03.2011, 23:06  [ТС]     Синглтон #5
Всем спасибо
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
08.03.2011, 23:20     Синглтон #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static int i=0;
 
class Singleton
{
public:
    Singleton() 
    {
        if(i==0)
        {i++;}
        else { delete this; }
    }
};
int main()
  {
    Singleton s1;   //ok
//  Singleton s2;   //no ok
 
    system("pause");
    return 0;
}
а так правильно?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2011, 23:31     Синглтон #7
это можно было назвать подсчетом ссылок (reference counting)
но код не ахти
i стоит внести в класс
а
Цитата Сообщение от dimon1984 Посмотреть сообщение
delete this;
приведет к плохим последствиям, если объект создавался не через new

но кстати это хорошая мысль
объедените свои мысли с моим примером
это делается через добавление функций AddRef которая увеличивает i (также как и instance) и DefRef - уменьшает i, когда i==0 делает delete и обнуляет указатель

Добавлено через 58 секунд
получится модель подсчета ссылок как в COM
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.03.2011, 07:58     Синглтон #8
Чтобы не объявлять что-то вне класса можно так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
class  T_singleton
{
    int  i_;
    //-----------------------------------------------------------------------------------
    T_singleton(int  i) : i_(i)
    {
        std::cout << "Создан объект класса T_singleton со значением i_ = "
                  << i_
                  << "."
                  << std::endl;
    }
public:
    //-----------------------------------------------------------------------------------
    static T_singleton*  instance(int  i)
    {
        static T_singleton*  sp = 0;
        if(!sp)
        {
            sp = new T_singleton(i);
        }
        return  sp;
    }    
};
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    T_singleton*  sp   = T_singleton::instance(1);  
    T_singleton*  ssp  = T_singleton::instance(2);  
}
LeX
222 / 222 / 57
Регистрация: 30.06.2010
Сообщений: 811
09.03.2011, 18:44     Синглтон #9
а возможно что бы конструктор проверял статик поле и если оно 0, то создавал новый объект и присваивал статику, а если нет, то выдавал сразу содержимое статик поля?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
09.03.2011, 21:13     Синглтон #10
LeX BB, М. Конструктор вызывается при создании объекта...
Если из конструктора вызвать тот же конструктор, что получится?
LeX
222 / 222 / 57
Регистрация: 30.06.2010
Сообщений: 811
09.03.2011, 21:15     Синглтон #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Если из конструктора вызвать тот же конструктор, что получится?
ничего хорошего. просто "висяк" мне кажется. он будет до бесконечности сам себя вызывать. я так думаю
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
09.03.2011, 21:24     Синглтон #12
LeX BB, Правильно. Бесконечная рекурсия. Этого хватает для ответа на ваш вопрос?
LeX
222 / 222 / 57
Регистрация: 30.06.2010
Сообщений: 811
09.03.2011, 21:30     Синглтон #13
ForEveR, хм. я знал что в этом случае так будет. а сделать какое нить шаманство типо такого нельзя?:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Singleton
{
public:
    Singleton(void)
        {
            if (EksempSingleton) this=EksempSingleton;
        }
    int a;
    ~OneEks(void)
        {
            EksempSingleton=0;
        }
private:
    static Singleton *EksempSingleton;
};
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.03.2011, 21:32     Синглтон #14
delete
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 22:22     Синглтон
Еще ссылки по теме:

Синглтон вызывает синглтон Java SE
Visual C++ Паттерн фабрика + синглтон + посетитель
синглтон и синхронизация Java SE
C++ Синглтон как антипаттерн
Проверка порта, синглтон для процесса и др PHP

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.03.2011, 22:22     Синглтон #15
Цитата Сообщение от LeX BB Посмотреть сообщение
if (EksempSingleton) this=EksempSingleton;
в с++ такое нельзя, иначе бы в с++ существовало некоторое подобие виртуального конструктор
такая проблема решается либо через фабрику, генерирующую синглтон, либо через статический метод самого синглтона
Yandex
Объявления
09.03.2011, 22:22     Синглтон
Ответ Создать тему
Опции темы

Текущее время: 08:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru