Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126

Зачем нам нужны синглтоны в С++?

05.03.2018, 19:34. Показов 1969. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Когда-то давно (лет 7 назад) читал я Александреску. И обратил внимание, что он много места уделял созданию синглтонов. То есть таких типов, чтобы объекты этого типа существовали в программе в единственном экземпляре.

Вопросы:

1. А зачем нам вообще нужны такие объекты, которые существуют в программе в единственном экземпляре?

2. В чем проблема просто тупо создать объект указанного типа один раз в программе и больше не создавать объектов такого типа?

3. Статический член любого класса существует в программе в единственном экземпляре. Это проверяют транслятор и линкер и при попытке создать второй экземпляр статического члена класса выдается ошибка. Чем статический член любого класса не синглтон?

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.03.2018, 19:34
Ответы с готовыми решениями:

Зачем нам заграница
Сижу вот думаю, есть ли смысл куда либо уезжать, сам с Новосибирска. Есть возможность уехать в Канаду программером но сейчас и здесь...

Зачем нужен Interface(не формы). Что он нам даёт?
Пожалуйста расскажите на пальцах как для супер новичка зачем нужен Interface(не формы). Что он нам даёт? Заранее спасибо.

А нужны ли нам web services?
начало темы: http://relib.com/forums/topic.asp?pg=100&id=772460 p.s.: это не спор Java vs .NET, так что даже не смейте начинать....

14
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.03.2018, 19:45
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Статический член любого класса существует в программе в единственном экземпляре.
он единственный в зоне видимости класса, а классов со статическими полями может быть много.
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
2. В чем проблема просто тупо создать объект указанного типа один раз в программе и больше не создавать объектов такого типа?
проблема в том что если проект большой то можно случайно создать два объекта.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
05.03.2018, 19:53
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Статический член любого класса существует в программе в единственном экземпляре
Но он существует с самого начала работы программы. А если нужно создать экземпляр класса уже во время работы программы (чтобы перед этим загрузить/получить параметры конструктора)?

Собственно синглтоны и реализуются на основе статических членов класса или локальных статических переменных статической функции класса.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.03.2018, 20:07
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
А зачем нам вообще нужны такие объекты, которые существуют в программе в единственном экземпляре?
затем, что создание двух и более могут привести к неправильной работе.
например: создание двух графических подсистем в одном приложении.

Цитата Сообщение от pepsicoca2 Посмотреть сообщение
В чем проблема просто тупо создать объект указанного типа один раз в программе и больше не создавать объектов такого типа?
в человеческом факторе.

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

Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Статический член любого класса существует в программе в единственном экземпляре. Это проверяют транслятор и линкер и при попытке создать второй экземпляр статического члена класса выдается ошибка. Чем статический член любого класса не синглтон?
статический член класса - один из каноничных способов создания сингелтона.

см. "сингелтон Майерса".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.03.2018, 22:20
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Статический член любого класса существует в программе в единственном экземпляре.
Ну и что? В С++ всё что не по ссылке - копируется что при передаче, что при возврате.
Кроме того:
Любой молоток это инструмент, но не любой инструмент это молоток. Синглтон можно создать путём инициализации статического объекта, но не наоборот. Если вы создали статическую переменную типа int в программе или если хотите - в классе (хотя причём тут классы?), это не значит, что это будет единственный экземпляр типа int в программе.
Если Вы хотели сказать, что жменя статических переменных и функций их использующих, прикрытые неймспейсом это альтернатива синглтону, то и тут Вы не правы. У класса есть возможность определять операторы - члены.
И класс может быть шаблонным к тому же. То есть для каждой комбинации параметров-типов можно получить свой инстанс и только необходимости и там и тогда, где и когда потребуется.
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
В чем проблема просто тупо создать объект указанного типа один раз в программе и больше не создавать
В том, что одной из основных задач является написание библиотек. Будете юзера за руки держать?
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
06.03.2018, 00:02  [ТС]
А если нужно создать экземпляр класса уже во время работы программы (чтобы перед этим загрузить/получить параметры конструктора)?

Это решается элементарно. Конструктор по умолчанию ничего не делает. И создается метод, который работает как конструктор. Когда данные для реального конструктора получены, вызывается этот метод. Типа как здесь:

C++
1
2
3
4
5
6
7
8
9
10
11
class a{
 
public:
 
a(){}
 
void fun_ctor(int, float, double){
//some action
}
 
};
Добавлено через 24 минуты
Вобщем напишу пример синглтона на статическом члене класса, а то какое-то недопонимание получается.
Пример не транслировал.

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
class shell_singleton;
 
clacc singleton{
friend shell_singleton;
 
private:
void method1(){/*some action*/}
void method2(int a){/*some action*/}
void method3(int a,float b){/*some action*/}
 
public:
};
 
class shell_singleton{
 
static singleton singleton_var;
 
public:
 
void method1(){singleton_var.method1();}
void method2(int a){singleton_var.method2(a);}
void method3(int a,float b){singleton_var.method3(a,b);}
};
 
singleton shell_singleton::singleton_var;
 
void main(){
shell_singleton shell_singleton_var;
 
shell_singleton_var.method1();
shell_singleton_var.method2(3);
shell_singleton_var.method3(5,10.1);
}
В этом примере экземпляр shell_singleton::singleton_var; не может быть создан второй раз.
Попытка создания shell_singleton::singleton_var; приведет к ошибки компиляции или линковки.
Не нужны никакие счетчики создания экземпляров класса.
Все решается средствами компилятора и линкера.
Вместе с тем, даже если создать экземпляр singleton, то работать с ним нельзя, так как все его методы приватные.
Но это я перестраховался, проще пользователям не объявлять вообще о существовании класса singleton, пусть работают с классом shell_singleton.
1
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
07.03.2018, 05:27  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
В том, что одной из основных задач является написание библиотек. Будете юзера за руки держать?
Подумал тут на досуге. Ну вот создал программист синглтон. Типа защитил себя от ужасных юзеров. А юзер взял и создал DLL и в этой DLL создал второй экземпляр типа синглтона. Никакой компилятор это не отследит, так как DLL транслируется и линкуется отдельно. И от чего вы тогда защитились синглтоном?

0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
07.03.2018, 06:28
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
А юзер взял и создал DLL и в этой DLL создал второй экземпляр типа синглтона.
пример-иллюстрацию в студию.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.03.2018, 08:09
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
. И от чего вы тогда защитились синглтоном?
Вы можете создавать синглтоны также и в различных приложениях (исполняемых файлах), разных компонентах IPC если говорить более обобщённо. Это потому что каждая абстракция это и есть её граница. Сфера это и фигура и собственная граница, например. Пересекая границу мы не можем не разрушить абстракцию. Синглтон это уникальность в пределах приложения. Но не во вселенной. Ваш подход
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Вобщем напишу пример синглтона
Заставляет меня думать. Что-то в нём есть, если даже не для синглтона как такового, то для некоего инкапсулированного объекта... На выходных откомпилю и посмотрю поближе. Навскидку - сложнее будут выглядеть перегрузки операторов. Потребуется преобразование типа между объектом и оболочкой. Но не хочу сотрясать воздух без анализа.
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
07.03.2018, 12:09  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Синглтон это уникальность в пределах приложения.

Тут коллеги утверждают, что синглтон нужен для того, чтобы в БОЛЬШИХ приложениях СЛУЧАЙНО не создать второй экземпляр класса, который должен быть только в одном экземпляре.
Но БОЛЬШИЕ приложения сейчас не делаются одним екзешником.
БОЛЬШИЕ приложения сейчас состоят из многих DLL.
Получается, что синглтон не защищает от СЛУЧАЙНОГО создания второго экземпляра класса в какой-то DLL, входящей в приложение, то есть и в приложении в целом.
Получается, что синглтон не выполняет главного своего предназначения - автоматического запрета создания второго экземпляра синглтона.
То есть все равно надо читать описание и отслеживать вручную, что во всех DLL, из которых состоит приложение, не создается второй экземпляр синглтона.
То есть существование механизма DLL убивает идею синглтона.
Во всяком случае декларированную идею об автоматическом запрете создание второго экземпляра класса синглтона в БОЛЬШИХ приложениях.

Добавлено через 4 минуты
Цитата Сообщение от GbaLog- Посмотреть сообщение
пример-иллюстрацию в студию.
Пример создания DLL?
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
07.03.2018, 12:30
pepsicoca2, то что есть синглтон в одной длл не есть синглтон в другой, создание длл ради создания второго синглтона это ненужный хак.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
07.03.2018, 12:43
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Пример создания DLL?
пример создания двух синглтонов в одном приложении с помощью DLL или что вы там хотите.
желательно, чтобы в конструкторе синглтона был вывод в консоль того, что он родился.

Добавлено через 10 минут
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Получается,
что создание второго экземпляра синглтона противоречит определению синглтона, так что это уже даже не синглтон и, в соответствии с этим, утверждение
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Получается, что синглтон не выполняет главного своего предназначения - автоматического запрета создания второго экземпляра синглтона.
неверно в корне.
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
08.03.2018, 16:24
pepsicoca2, напишите всё же, пожалуйста, программу-пример, демонстрирующую ваши догадки по поводу создания второго синглтона в DLL
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
То есть существование механизма DLL убивает идею синглтона.
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
08.03.2018, 23:09  [ТС]
Цитата Сообщение от dailydose Посмотреть сообщение
pepsicoca2, напишите всё же, пожалуйста, программу-пример, демонстрирующую ваши догадки по поводу создания второго синглтона в DLL
Извините, но сейчас некогда. Как-нибудь позже, когда время будет.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.03.2018, 05:41
Цитата Сообщение от pepsicoca2 Посмотреть сообщение
Извините, но сейчас некогда. Как-нибудь позже, когда время будет.
не забудь когда будешь писать Windows 3.0 поставить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2018, 05:41
Помогаю со студенческими работами здесь

Зачем нам два одинаковых свойства для Rectangle - Top и Y?
Зачем нам два одинаковых свойства для Rectangle - Top и Y?

Нам космические инженеры не нужны. Мы ищем установщиков программного обеспечения
Нам космические инженеры не нужны. Мы ищем установщиков программного обеспечения. Ношу резюме в Технополис GS г. Гусев с времён когда они...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Зачем нужны операторы << и >>
В книжке Дейтлов есть код http://pic.ipicture.ru/uploads/091222/thumbs/q1TZw4n1JQ.jpg Вопрос в том, что там где написано, что числа...

Зачем нужны Интерфейсы
Здравствуйте. Вот такой у меня вопрос, касательно самой сути интерфейсов - зачем они нужны? В моем понимании интерфейс - видимая часть...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru