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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.64
DiabloRossi
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 49
08.03.2011, 22:32     Синглтон #1
необходимо разработать класс, который бы гарантировал, что его экземпляр будет один и только один из объектов данного класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dyosick
 Аватар для dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
08.03.2011, 22:41     Синглтон #2
Это называется паттерн проектирования Одиночка(Singleton) - скачай книгу Э.Гамма, Хелм, Джонсон, Влиссидес "Приемы объектно-ориентированого проектирования" раздел "Порождающие паттерны". Там есть то, что тебе нужно
lemegeton
 Аватар для lemegeton
2910 / 1339 / 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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,686
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
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
09.03.2011, 18:44     Синглтон #9
а возможно что бы конструктор проверял статик поле и если оно 0, то создавал новый объект и присваивал статику, а если нет, то выдавал сразу содержимое статик поля?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 21:13     Синглтон #10
LeX BB, М. Конструктор вызывается при создании объекта...
Если из конструктора вызвать тот же конструктор, что получится?
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
09.03.2011, 21:15     Синглтон #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Если из конструктора вызвать тот же конструктор, что получится?
ничего хорошего. просто "висяк" мне кажется. он будет до бесконечности сам себя вызывать. я так думаю
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 21:24     Синглтон #12
LeX BB, Правильно. Бесконечная рекурсия. Этого хватает для ответа на ваш вопрос?
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.03.2011, 21:32     Синглтон #14
delete
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 22:22     Синглтон
Еще ссылки по теме:

C++ Мой синглтон. Дайте рекомендации, оцените, пожалуйста
C++ Синглтон для лог файла!
В проекте "Фильмы" реализовать три паттерна: адаптер, синглтон, прокси C#

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

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

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