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

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

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

Сообщений: 2921



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

Весьма сомнительная статейка Улыбающийся Если "ближе к стандарту", то наверное "нелокальная переменная с локальной областью видимости". Хотя и так ясно что имелось ввиду, просто иногда хочется попридираться  Улыбающийся
Статейка может и сомнительная, но в ней правильно сказано где хранятся статические данные.
И, да, придираюсь)
Особенно когда осознанно или нет высказываются такие мысли.
Записан

Qt 5.11/4.8.7 (X11/Win)
BuRn
Гость
« Ответ #16 : Декабря 09, 2014, 18:13 »

Согласен - чудо код, ещё и коннект прописан в месте, где ничего не создается вроде бы.
Хотя если честно впервые вижу коннект после описания класса.
Да действительно с new косяк, а коннект я просто вынес из метода, дабы ненужные куски не включать
Записан
Hrundel
Гость
« Ответ #17 : Декабря 10, 2014, 16:03 »

Попробуй с этим вариантом:

Код
C++ (Qt)
#ifndef SINGLETON_H
#define SINGLETON_H
 
#include <stddef.h>
 
template <class T>
class Singleton
{
   static T* _self;
   static int _refcount;
protected:
   Singleton(){}
   virtual ~Singleton(){_self = NULL;}
public:
   static T* Instance();
   void FreeInst();
};
 
template <class T>
T*  Singleton<T>::_self = NULL;
 
template <class T>
   int  Singleton<T>::_refcount=0;
 
template <class T>
T*  Singleton<T>::Instance()
{
     if(!_self) _self=new T;
     _refcount++;
     return _self;
}
 
template <class T>
void  Singleton<T>::FreeInst()
{
   if(--_refcount==0) delete this;
}
 
#endif // SINGLETON_H
 

Расширь его соответственно
« Последнее редактирование: Декабря 10, 2014, 16:04 от Hrundel » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Попробуй с этим вариантом:

Код
C++ (Qt)
#ifndef SINGLETON_H
#define SINGLETON_H
 
#include <stddef.h>
 
template <class T>
class Singleton
{
   static T* _self;
   static int _refcount;
protected:
   Singleton(){}
   virtual ~Singleton(){_self = NULL;}
public:
   static T* Instance();
   void FreeInst();
};
 
template <class T>
T*  Singleton<T>::_self = NULL;
 
template <class T>
   int  Singleton<T>::_refcount=0;
 
template <class T>
T*  Singleton<T>::Instance()
{
     if(!_self) _self=new T;
     _refcount++;
     return _self;
}
 
template <class T>
void  Singleton<T>::FreeInst()
{
   if(--_refcount==0) delete this;
}
 
#endif // SINGLETON_H
 

Расширь его соответственно

Да, delete this - это сильно)
Записан

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

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

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #19 : Декабря 10, 2014, 16:16 »

Hrundel, не тредсэйф.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Hrundel
Гость
« Ответ #20 : Декабря 10, 2014, 16:27 »

Hrundel, не тредсэйф.

У меня все прекрасно работает. В том виде в каком оно есть.
« Последнее редактирование: Декабря 10, 2014, 16:29 от Hrundel » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Декабря 10, 2014, 17:43 »

У меня все прекрасно работает. В том виде в каком оно есть.
Это потому, что у вас несколько ниток одновременно не пытаются создать instance. А так их может быть создано несколько, несмотря на то что это синглетон. Улыбающийся
Записан
Bepec
Гость
« Ответ #22 : Декабря 10, 2014, 20:19 »

Old - если его могут создать несколько штук, он автоматом перестаёт быть сигнлтоном Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Old - если его могут создать несколько штук, он автоматом перестаёт быть сигнлтоном Улыбающийся
Вот так в многопоточной среде синглетон теряет девственность.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #24 : Декабря 10, 2014, 20:42 »

Вот классический вариант с использованием std::call_once

Код
C++ (Qt)
template <class T>
class singleton
{
public:
   static T& instance()
   {
       std::call_once(m_once_flag, [] { m_instance.reset(new T); });
       return *m_instance.get();
   }
 
   singleton() = delete;
   singleton(const singleton&) = delete;
   singleton& operator=(const singleton&) = delete;
 
private:
   static std::unique_ptr<T> m_instance;
   static std::once_flag m_once_flag;
};
 
template <class T>
std::unique_ptr<T> singleton<T>::m_instance;
 
template <class T>
std::once_flag singleton<T>::m_once_flag;
 
Записан

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

Arch Linux Plasma 5
Hrundel
Гость
« Ответ #25 : Декабря 11, 2014, 00:07 »

Вот классический вариант с использованием std::call_once

Код
C++ (Qt)
template <class T>
class singleton
{
public:
   static T& instance()
   {
       std::call_once(m_once_flag, [] { m_instance.reset(new T); });
       return *m_instance.get();
   }
 
   singleton() = delete;
   singleton(const singleton&) = delete;
   singleton& operator=(const singleton&) = delete;
 
private:
   static std::unique_ptr<T> m_instance;
   static std::once_flag m_once_flag;
};
 
template <class T>
std::unique_ptr<T> singleton<T>::m_instance;
 
template <class T>
std::once_flag singleton<T>::m_once_flag;
 

Спасибо, запишем, будем пользовать.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #26 : Декабря 11, 2014, 00:41 »

Спасибо, запишем, будем пользовать.

Если честно, то я бы не стал этим пользоваться.. Этот код избыточен..
С таким же успехом можно написать и короче:
Код
C++ (Qt)
template <class T>
T& singleton()
{
   static T instance;
   return instance;
}
 
Записан

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

Arch Linux Plasma 5
Hrundel
Гость
« Ответ #27 : Декабря 11, 2014, 12:10 »

Код
C++ (Qt)
template <class T>
T& singleton()
{
   static T instance;
   return instance;
}
 

В этом варианте не вижу, где он проверяет сам себя на existenz
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


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

А ему это не нужно, статическая переменная инициализируется только один раз.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Да, delete this - это сильно)
Это нормальная конструкция, никакого криминала здесь нет.

Если честно, то я бы не стал этим пользоваться.. Этот код избыточен..
Последние проблески здравого смысла  Улыбающийся

С таким же успехом можно написать и короче:
Код
C++ (Qt)
template <class T>
T& singleton()
{
   static T instance;
   return instance;
}
 
И на древнем gcc 4.2 это можно было делать задолго до С++ 11. Опция "statics thread-safe" защищает вызов конструктора instance атомарным локом (напр OSSpinLockLock). И вся мудистика с call_once вероятно сводится к тому же. Что кстати совсем не идеальное решение.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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