Russian Qt Forum
Май 02, 2024, 22:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Синглтон + сигналы QObject  (Прочитано 15586 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #30 : Декабрь 11, 2014, 12:56 »

Цитировать
Это нормальная конструкция, никакого криминала здесь нет.
А кто говорит о криминале?
Вы посмотрите внимательнее на реализацию того синглетона, прежде чем заявлять, что это нормальная конструкция)

Цитировать
Последние проблески здравого смысла  Улыбающийся

Ну куда уж мне до Вас, учитель..)

Цитировать
И вся мудистика с call_once вероятно сводится к тому же. Что кстати совсем не идеальное решение.
А мы увидим, интересно, идеальное решение от мастера? Ммм?

std::call_once избыточен даже из-за того, что можно было написать аналогично и без call_once:
Код
C++ (Qt)
template <class T>
class singleton
{
public:
   static T& instance()
   {
       static std::unique_ptr<T> instance(new T);
       return *instance.get();
   }
 
   singleton() = delete;
   singleton(const singleton&) = delete;
   singleton& operator=(const singleton&) = delete;
};
 
Но смысл?




Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Декабрь 11, 2014, 13:48 »

Вы посмотрите внимательнее на реализацию того синглетона, прежде чем заявлять, что это нормальная конструкция)
Посмотрел. Не нравится как автор ставит пробелы - а ошибок не вижу. Да, эта реализация не thread-safe, ну этого никто и не обещал. Да и не синглтон это вовсе  Улыбающийся

А мы увидим, интересно, идеальное решение от мастера? Ммм?
Здесь его достаточно услышать. Напомню из-за чего сыр-бор: мы почему-то упорно хотим объявить экземпляр внутри ф-ции/метода. Зачем? А вдруг мы никогда его не будем использовать - вот тогда сэкономим. Вы верите в такую экономию? (я нет). Реально потому что "std-дядя так сказал", а мы уже привыкли послушно делать все что дядя скажет  (и хвостик подымать на тех кто так не делает Улыбающийся).

Решение 1: почему не просто объявить instance вне метода? Тогда конструктор вызовется до main, никаких проблем с "многопоточностью" нет.

Решение 2: Хорошо, не нравится до main, но что мешает вызвать getInstance() до запуска ниток? Этот момент всегда прекрасно известен и серия действий там всегда есть.

Оба решения не имеют накладных расходов на локи и.т.п. Но не тут-то было
std::call_once избыточен даже из-за того, что можно было написать аналогично и без call_once:
Код
C++ (Qt)
template <class T>
class singleton
{
public:
   static T& instance()
   {
       static std::unique_ptr<T> instance(new T);
       return *instance.get();
   }
 
   singleton() = delete;
   singleton(const singleton&) = delete;
   singleton& operator=(const singleton&) = delete;
};
 
Но смысл?
Смысл - загадить текст и сделать его недоступным для простых людей. Показать владение широким арсеналом средств, нисколько не смущаясь их неадекватностью в задаче.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #32 : Декабрь 11, 2014, 18:54 »

Да и не синглтон это вовсе  Улыбающийся
Почему вы так подумали?

Реально потому что "std-дядя так сказал", а мы уже привыкли послушно делать все что дядя скажет  (и хвостик подымать на тех кто так не делает Улыбающийся).
Если этот дядя вас будет уговаривать конфетками сесть к нем в машину не соглашайтесь. И тем более хвостик не поднимайте.

Решение 1: почему не просто объявить instance вне метода? Тогда конструктор вызовется до main, никаких проблем с "многопоточностью" нет.
Создание объекта до main не всегда хорошо. Например, перед созданием instance нам нужно выполнить некоторые действия или создать другие объекты, тот-же QApplication.
К тому же, порядок создания глобальных объектов не определен, если при конструировании одного глобального объекта используется другой глобальный объект, может случиться так, что используемый объект еще не будет сконструирован. Не так давно было обсуждение на форуме с такой ситуацией.
Ну и последнее, если instance никому не нужно, то и создаваться оно не должно.

Решение 2: Хорошо, не нравится до main, но что мешает вызвать getInstance() до запуска ниток? Этот момент всегда прекрасно известен и серия действий там всегда есть.
Опять же это предполагает обязательное создание instance, в этом случае можно оформлять синглетон по типу QCoreApplication. Позволит еще и любые параметры в конструктор передавать.

Оба решения не имеют накладных расходов на локи и.т.п.
Они имеют значительно большие накладные расходы в виде самого объекта instance.

Смысл - загадить текст и сделать его недоступным для простых людей.
Простые люди, как правило, не читают программный код, это делаю программисты. Поэтому, нет повода для беспокойства.

А вообще, эту гадость (синглетон) лучше вообще не использовать. Улыбающийся
« Последнее редактирование: Декабрь 11, 2014, 19:12 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Декабрь 12, 2014, 10:15 »

Если этот дядя вас будет уговаривать конфетками сесть к нем в машину не соглашайтесь. И тем более хвостик не поднимайте.
Понял, учту Ваш опыт  Улыбающийся

.. если при конструировании одного глобального объекта используется другой глобальный объект, может случиться так, что используемый объект еще не будет сконструирован.
Oбъявление экземпляра в локальной области видимости не избавляет от этой проблемы. Напр если синглтон использует qApp, и так и так вызывать его до создания qApp нельзя.

Они имеют значительно большие накладные расходы в виде самого объекта instance.
Что ж там такого страшного в instance? (часто пустой контейнер). Вы обобщаете очень редкий случай.

А вот нельзя загрузить либу как weak (delay loaded dll в Вындоуз) если у нее есть активные объекты до main. С этим я бы, пожалуй, согласился.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #34 : Декабрь 12, 2014, 13:18 »

Oбъявление экземпляра в локальной области видимости не избавляет от этой проблемы. Напр если синглтон использует qApp, и так и так вызывать его до создания qApp нельзя.
Как же не избавляют? Как раз избавляют. Мы точно знаем, когда будет создано instance, точнее оно будет создано когда мы этого захотим. Мы можем управлять этим процессом, чего нельзя сказать о глобальных объектах.

Что ж там такого страшного в instance? (часто пустой контейнер). Вы обобщаете очень редкий случай.
Это для вас редкий случай, а для меня был бы частым, если бы я пользовался этой дрянью. К тому же объект класса далеко не всегда является контейнером, тем более пустым. Улыбающийся
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 23.