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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Зачем хранить instance синглтона в атрибутах класса?  (Прочитано 11052 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Июнь 14, 2012, 18:08 »

Каким образом он инициализируется до main()?
Тем же самым как все "non-local variables" (как-то так это звучит в стандарте). Статический член класса или член глобальная переменной класса в эту категорию входят. Впрочем стандарт не настаивает на "до main" допускаются реализации типа "на входе" но суть та же.

Алексей, Вы производите впечатление человека с опытом, ну почему тема яйца выеденного не стоит? Понимаю, хочется отдохнуть (серьезных забот хватает на работе), но все же обсуждение куда воткнуть 1 строку не выглядит хорошо Улыбающийся  Поэтому умолкаю
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #16 : Июнь 14, 2012, 18:26 »

Я хочу добраться до истины Злой (ну и отдохнуть  Смеющийся) В твоём случае статический и не динамический атрибут нужно явным образом глобально инициализировать наподобие "Example Example::m_instance;", я понял что значит "до main()", это почти тоже самое что и явное создание объекта Маерса через Example::instance() в начале main(). Итого, синглтон Маерса удобнее, т.к. содержит меньше ненужного кода, что есть добро. Мои рассуждения такие. То есть тема показала, как я и предполагал, что классическая реализация синглтона через статический атрибут просто традиция.
« Последнее редактирование: Июнь 14, 2012, 18:36 от Alex Custov » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #17 : Июнь 14, 2012, 19:05 »

Итого, синглтон Маерса удобнее, т.к. содержит меньше ненужного кода, что есть добро.
С чего это меньше-то? Всё поровну:
Код
C++ (Qt)
class Example
{
   public:
       static Example *instance();
 
   private:
       Example(){}
};
 
 
Example * Example::instance()
{
   static Example *inst = new Example;
   return inst;
}
 
int main(int argc, char *argv[])
{
   Example::instance();
   // ...
}

Код
C++ (Qt)
class Example
{
   public:
       static Example *instance();
 
   private:
       Example(){}
       static Example *inst;
 
};
 
Example *inst = new Example;
 
Example * Example::instance()
{
   return inst;
}
 
int main(int argc, char *argv[])
{
   // ...
}

Синглтон Маерса удобен, если могут возникать случаи, что синглтон и не нужен. Тогда instance() не вызовется и объект не создастся.
Классика же удобна, когда синглотон должен существовать обязательно, тогда порождение его содержится в самом классе и не нужно думать что бы ещё такое дописать в мейн.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #18 : Июнь 14, 2012, 19:30 »

С чего это меньше-то? Всё поровну:
Example * Example::inst = new Example;

Разве так можно? По-мойму по стандарту это UB, и поэтому классический синглтон неудобен, т.к. в нём нужно делать статический атрибут, и в конструкторе ему присваивать this. Или использовать нединамический вариант, который почему-то не слишком популярен. Т.к. я всегда использую динамический, мне вариант с

Код
C++ (Qt)
Example * Example::instance()
{
   static Example *inst = new Example;
   return inst;
}
 

удобнее. А если программа без потоков, то его даже инициализировать не нужно в main().
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #19 : Июнь 14, 2012, 19:34 »

в вики есть ссылка на статью нашего ufna про переносимый синглтон: http://ufna.ru/2010/04/24/singleton-for-qt
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #20 : Июнь 14, 2012, 21:46 »

По-мойму по стандарту это UB
Так по вашему или по стандарту?

Или использовать нединамический вариант, который почему-то не слишком популярен.
У нединамического варианта есть свои плюсы. При выходе из программы такой объект будет разрушен, что важно, если у него (или его «детей») деструктор имеет некоторую смысловую нагрузку.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #21 : Июнь 14, 2012, 22:15 »

Госпади, ну сколько ж можно жевать...

Код:
Q_GLOBAL_STATIC(MyClass, static_instance)
MyClass * MyClass::instance()
{
    return static_instance();
}

А в qt5 там еще и проблем не будет у этого макроса.
Записан
DmitryM
Гость
« Ответ #22 : Июнь 28, 2012, 10:28 »

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


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