Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/30: Рейтинг темы: голосов - 30, средняя оценка - 4.60
2 / 2 / 1
Регистрация: 09.02.2011
Сообщений: 49

Синглтон

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

Студворк — интернет-сервис помощи студентам
необходимо разработать класс, который бы гарантировал, что его экземпляр будет один и только один из объектов данного класса
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.03.2011, 22:32
Ответы с готовыми решениями:

Синглтон
Можете пожалуйста обьяснить суть вот этого кода: #define imSingleton ACE_Singleton<Singleton_obj, ACE_Null_Mutex>::instance()

Потокобезобасный синглтон
Имеется следующий драфт синглтона с отложенной инициализацией: class NormPool; typedef std::shared_ptr<NormPool> PNormPool; ...

Синглтон как антипаттерн
Доброе утро, данный паттерн называют часто анти-паттерном, но не называют "валидную" ему замену - как она? Как по мне...

14
 Аватар для dyosick
64 / 64 / 17
Регистрация: 25.08.2008
Сообщений: 178
08.03.2011, 22:41
Это называется паттерн проектирования Одиночка(Singleton) - скачай книгу Э.Гамма, Хелм, Джонсон, Влиссидес "Приемы объектно-ориентированого проектирования" раздел "Порождающие паттерны". Там есть то, что тебе нужно
2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.03.2011, 22:45
Ну или простенько.
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;
};
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2011, 22:55
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();
}
1
2 / 2 / 1
Регистрация: 09.02.2011
Сообщений: 49
08.03.2011, 23:06  [ТС]
Всем спасибо
0
40 / 38 / 5
Регистрация: 22.01.2011
Сообщений: 670
08.03.2011, 23:20
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;
}
а так правильно?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2011, 23:31
это можно было назвать подсчетом ссылок (reference counting)
но код не ахти
i стоит внести в класс
а
Цитата Сообщение от dimon1984 Посмотреть сообщение
delete this;
приведет к плохим последствиям, если объект создавался не через new

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

Добавлено через 58 секунд
получится модель подсчета ссылок как в COM
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
09.03.2011, 07:58
Чтобы не объявлять что-то вне класса можно так сделать:
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);  
}
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
09.03.2011, 18:44
а возможно что бы конструктор проверял статик поле и если оно 0, то создавал новый объект и присваивал статику, а если нет, то выдавал сразу содержимое статик поля?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.03.2011, 21:13
LeX BB, М. Конструктор вызывается при создании объекта...
Если из конструктора вызвать тот же конструктор, что получится?
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
09.03.2011, 21:15
Цитата Сообщение от ForEveR Посмотреть сообщение
Если из конструктора вызвать тот же конструктор, что получится?
ничего хорошего. просто "висяк" мне кажется. он будет до бесконечности сам себя вызывать. я так думаю
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.03.2011, 21:24
LeX BB, Правильно. Бесконечная рекурсия. Этого хватает для ответа на ваш вопрос?
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
09.03.2011, 21:30
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;
};
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.03.2011, 21:32
delete
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.03.2011, 22:22
Цитата Сообщение от LeX BB Посмотреть сообщение
if (EksempSingleton) this=EksempSingleton;
в с++ такое нельзя, иначе бы в с++ существовало некоторое подобие виртуального конструктор
такая проблема решается либо через фабрику, генерирующую синглтон, либо через статический метод самого синглтона
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2011, 22:22
Помогаю со студенческими работами здесь

Синглтон для лог файла!
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;limits&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;fstream&gt; using namespace...

Синглтон и время его жизни
Создл синглтон, его задача прочитать конфигурационный файл в переменную records и давать возможность обращаться к нему по мере надобности. ...

Синглтон и стиль написания кода (теория)
В общем, тут диспут о правильном написании кода. Я знаю что такое синглтон, для чего он нужен и как реализуется. Однако меня...

Синглтон Мейерса, нужны некоторые пояснения
class Singleton{ public: static Singleton&amp; init() { static Singleton Object; return Object; } ...

Мой синглтон. Дайте рекомендации, оцените, пожалуйста
Доброе утро! Вот, наваял тут типа синглтон. Можете дать замечания по данной реализации. Спасибо! //...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru