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

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

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

Сообщений: 2063


Просмотр профиля
« : Июнь 14, 2012, 15:26 »

Почти во всех примерах instance синглтона хранится как атрибут "instance" класса, и которому ещё нужно явным образом присваивать this. Зачем это, если можно сделать с помощью самого языка

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

?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

А что будет если 2 или более нитки полезут в instance?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

А что будет если 2 или более нитки полезут в instance?

Всё тоже самое, как и классическом случае. Речь ведь не об этом. Все проблемы с синхронизацией решаются точно также.
Записан
iroln
Гость
« Ответ #3 : Июнь 14, 2012, 15:59 »

Почти во всех примерах instance синглтона хранится как атрибут "instance" класса, и которому ещё нужно явным образом присваивать this. Зачем это, если можно сделать с помощью самого языка
Я, например, так и делаю. Улыбающийся
Особого смысла хранить тоже не вижу.  Непонимающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Всё тоже самое, как и классическом случае. Речь ведь не об этом. Все проблемы с синхронизацией решаются точно также.
А зачем их решать и (пере)проверять установки компилятора если можно обойтись средствами языка объявив inst членом класса? 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

я вообще так пишу (многопоточность не используется если что):
Код
C++ (Qt)
class CharacterInfo
{
public:
   static CharacterInfo &instance()
   {
       static CharacterInfo obj;
       return obj;
   }
 
private:
   CharacterInfo() {}
};
Записан

Изучением 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
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

А зачем их решать и (пере)проверять установки компилятора если можно обойтись средствами языка объявив inst членом класса? 

А разве классический пример гарантирует thread-safe выполнение? Каким образом?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D0.BD.D0.B0_C.2B.2B
Цитировать
Впрочем, в C++11 синглтон Майерса является потокобезопасным и без всяких блокировок.
Улыбающийся
Записан

Изучением 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
iroln
Гость
« Ответ #8 : Июнь 14, 2012, 16:23 »

А зачем их решать и (пере)проверять установки компилятора если можно обойтись средствами языка объявив inst членом класса? 

А разве классический пример гарантирует thread-safe выполнение? Каким образом?
Классический пример ничего такого не гарантирует. Для потокобезопасности предлагают создавать экземпляр заранее, только тогда его надо хранить как член класса. А если экземпляр создавать в методе getInstance при первом обращении, тогда нужна синхронизация. Ну и зачем тогда хранить instance?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

Классический пример ничего такого не гарантирует. Для потокобезопасности предлагают создавать экземпляр заранее, только тогда его надо хранить как член класса. А если экземпляр создавать в методе getInstance при первом обращении, тогда нужна синхронизация. Ну и зачем тогда хранить instance?

Я ведь написал, что проблемы тут точно такие же. Они одинаково решаются вызовом Example::instance() где-нибудь в начале main(), и никакой синхронизации не надо, так чем классический пример лучше?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D0.BD.D0.B0_C.2B.2B
Цитировать
Впрочем, в C++11 синглтон Майерса является потокобезопасным и без всяких блокировок.
Улыбающийся

Вот, теперь узнал что этот синглтон даже имя имеет Смеющийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

На мой взгляд такая "элегантность" совсем ни к чему. Объявив inst членом мы ясно показываем чего хотим, и ключи компиляции нас не волнуют. Да и не всякий отладчик покажет статик с локальной областью видимости. Чего же достигли? Да ничего, так, повыдрючивались  Улыбающийся

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

Сообщений: 2063


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

На мой взгляд такая "элегантность" совсем ни к чему. Объявив inst членом мы ясно показываем чего хотим, и ключи компиляции нас не волнуют.

Это уже религия. Лично по моему опыту если в классе есть статический метод instance(), то уже ясно что он делает. А что именно за ключи?

Да и не всякий отладчик покажет статик с локальной областью видимости. Чего же достигли? Да ничего, так, повыдрючивались  Улыбающийся

Это более весомый аргумент, если это для программиста важно и он пользуется именно таким таким дебагером.

Зачем придавать этому глубокомысленный вид ("классический сингтон майерса" и все такое)?  Где Вы тут усмотрели "классику"?  Улыбающийся

Классикой я называю как раз статический атрибут, так делают почти везде. Но по идее он ничем не лучше, и по моему мнению даже хуже (функциональность та же, а лишнего кода больше) чем статическая переменная внутри instance().
« Последнее редактирование: Июнь 14, 2012, 17:03 от Alex Custov » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

А что именно за ключи?
В gcc "no-threadsafe-statics". Хотя по умолчанию такие статики защищаются, возможность получить по рыльцу все же есть. И уж совсем непрактично ковыряться в подробностях напр MSVC чтобы убедиться. Да объявил членом, инициализируется до main - и все дела
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

Да объявил членом, инициализируется до main - и все дела

Каким образом он инициализируется до main()?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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