Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сиглитон или статические переменные спец.класса, философский вопрос 
:(
    Опции темы
mrbrooks
Дата 8.8.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Глобальные переменные это не есть гуд. 
Решение - создать класс со статическими переменными и статическими методами для работы с ними и собственно юзать их. Так и поступал. Пока не наткнулся на Шаблон Синглетон (Singleton pattern). Вещь любопытная и видимо стоящая. Как вы считаете комрады?
PM MAIL   Вверх
andrew_121
Дата 8.8.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33





--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mrbrooks
Дата 8.8.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



andrew_121, ага. от туда и почерпнул  smile 
PM MAIL   Вверх
Alek86
Дата 8.8.2008, 10:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



автор, что ты от форумчан хочешь?
благословения?

в таком случа благословляю тебя на использование синглетона...


--------------------
user posted image    user posted image
PM MAIL   Вверх
Daevaorn
Дата 8.8.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(mrbrooks @  8.8.2008,  10:25 Найти цитируемый пост)
Вещь любопытная и видимо стоящая. Как вы считаете комрады? 

Если Вы на него только наткнулись, то всё сообщество программистов его использует уже оооочень много времениsmile
Вещь хорошая, нужная, но как и всем на свете - не надо злоупотреблять.
PM MAIL WWW   Вверх
mrbrooks
Дата 8.8.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Alek86 хочу я мнения. фиг ты с этим синглетоном или же нет. а то малоли какие нибудь подводные камни. 
но за благословление спасибо.  smile 

Это сообщение отредактировал(а) mrbrooks - 8.8.2008, 10:59
PM MAIL   Вверх
UnrealMan
Дата 8.8.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(andrew_121 @ 8.8.2008,  09:58)
http://en.wikipedia.org/wiki/Singleton_pattern

Википедия отжигает

Цитата
Код

template<typename T> class Singleton
{
  public:
    static T& Instance()
    {
        static T theSingleInstance;  // assumes T has a protected default constructor
        return theSingleInstance;
    }
    virtual ~Singleton();            //a virtual destructor is needed if we need to execute
                                     //code in the derived class' destructor. 
};

Зачем синглтону (тем более создаваемому в статической памяти) виртуальный деструктор? smile
PM MAIL   Вверх
Mayk
Дата 8.8.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Меня запинают, но в C# идёт такое же обсуждение - что лучше static class, или singleton. ыыы.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mrbrooks
Дата 8.8.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(Mayk @ 8.8.2008,  16:08)
Меня запинают, но в C# идёт такое же обсуждение - что лучше static class, или singleton. ыыы.

ыыы. и там тоже благославляют на использование сиглитонов?
PM MAIL   Вверх
Mayk
Дата 8.8.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(mrbrooks @  8.8.2008,  20:17 Найти цитируемый пост)
ыыы. и там тоже благославляют на использование сиглитонов? 

нет. там некоторые говорят что статики руляд.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
W4FhLF
Дата 8.8.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



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

Код

    class Font {...}; 
    class Printerport { ... }; 
    class PrintJob { ... } 
    class MyOnlyPrinter 
    { 
    public: 
        static void AddPrintJob(PrintJob& newjob) 
        { 
            if (pHntQueue_.empty() && printingPort_.available()) 
            { 
                printingPort_. send(newJob.DataO); 
            } 
            else 
            { 
                printQueue_.push(newjob);
            } 
        } 
    private: 
        // все данные являются статическими 
        static std::queue<PrintJob> printQueue_; 
        static printerport printingport_; 
        static Font defaultFont_; 
    } 
    Print Job somepri ntJobCMyDocument.txt") ; 
    MyOnlyPrinter::AddPrintJob(somePrintiob); 


Однако это решение в некоторых ситуациях имеет много недостатков. Основная  
проблема заключается в том, что статические функции не могут быть виртуальными, что не 
позволяет изменять поведение объекта при открытии кода класса MyOnlyPrinter. 
Кроме того, инициализация и удаление объекта затрудняются. В классе  
MyOnlyPrinter нет конкретных точек, в которых инициализируются и удаляются данные, 
хотя эти задачи могут быть нетривиальными — например, переменная-член default- 
Font, может зависеть от скорости обмена данными порта, поведение которого  
описывается переменной printingport_. 

(с) Александреску



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alek86
Дата 8.8.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(UnrealMan @  8.8.2008,  11:23 Найти цитируемый пост)
Зачем синглтону (тем более создаваемому в статической памяти) виртуальный деструктор? 

вообще-то все правильно
синглтон из примера используется как базовый класс
Код

class Mainframe : public Singleton<Mainframe> {};


Добавлено @ 16:44
и где написано, что он создается в статической памяти?

Это сообщение отредактировал(а) Alek86 - 8.8.2008, 16:44


--------------------
user posted image    user posted image
PM MAIL   Вверх
Mayk
Дата 8.8.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Alek86 @  8.8.2008,  20:43 Найти цитируемый пост)
и где написано, что он создается в статической памяти?

см ф-цию Instance.
Цитата(UnrealMan @  8.8.2008,  15:23 Найти цитируемый пост)
    static T& Instance()
    {
        static T theSingleInstance;  // assumes T has a protected default constructor
        return theSingleInstance;
    }




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
UnrealMan
Дата 8.8.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Alek86 @  8.8.2008,  16:43 Найти цитируемый пост)
вообще-то все правильно
синглтон из примера используется как базовый класс

Ну и что с того? Виртуальный деструктор нужен для того, чтобы

1) объект, размещённый в динамической памяти, можно было корректно удалить, используя указатель на базовый подобъект,
2) базовый класс стал полиморфным.

В приведённом примере создание и уничтожение объекта-синглтона полностью отдано на откуп базовому классу. Никто снаружи не вправе явно вызывать деструктор или delete для объекта-синглтона. С учётом того, что базовый класс знает точный тип производного (его передают шаблонным параметром), даже если объект будет создаваться в динамической памяти, корректно удалить его без виртуального деструктора не составит никакого труда. Таким образом, первый пункт совершенно не актуален.

Теперь разберёмся со вторым пунктом. Нужно ли здесь полиморфное поведение Singleton<T>? Зачем? Какой толк использовать указатель или ссылку на Singleton<T> как операнд dynamic_cast или typeid? Никакого.

Итог: виртуальный деструктор здесь не нужен.
Применение "умных" правил без понимания того, какие рациональные мотивы стоят за этими правилами, есть свидетельство тупости.
PM MAIL   Вверх
Torsten
Дата 10.8.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: 3
Всего: 7



Цитата(mrbrooks @  8.8.2008,  10:58 Найти цитируемый пост)
 фиг ты с этим синглетоном или же нет. а то малоли какие нибудь подводные камни. 

Правило очень простое.
Если во время выполнения программы может быть создан и использован только 1 обьект некоторого класса - это сигнлтон. Иногда конечно могут быть исключения, зависит от контекста, но в 99% это синглтон.

Это сообщение отредактировал(а) Torsten - 10.8.2008, 20:06
--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1074 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.