singlepost

C++ – что значит" class Singleton : public X {" ? << На главную или назад  

классы обычно объявляются как
class name {
object name1;
object name2;
etc
}

а что значит
такое объявление:
template <class X>
class Singleton : public X {
public:
static Singleton<X>& get() {
static Singleton<X> instance;
return instance;
}
private:
Singleton() : X() {};
Singleton(const Singleton&);
};
интересует вот эта строчка " class Singleton : public X {"
остальной код для полноты

38 ответов в теме “C++ – что значит" class Singleton : public X {" ?”

  1. 22
    Александр Новиков ответил:

    спасибо

  2. 21
    Дмитрий Иванов ответил:

    >Да и главное очень трудно поддерживать код. Нет в шаблонах С++ такой элегантности как в том же Хаскеле, получается огород из темплейтов в которой не то что командной разработке… самому даже толком не разобраться иногда что написал.

    На счет плохой поддерживаемости не соглашусь, как и на счет того, что не разобраться. Просто код надо нормальный писать.

  3. 20
    Александр Новиков ответил:

    а можно ссылку на банду четырех?)

  4. 19
    Дмитрий Иванов ответил:

    Николай Митропольский, почитал про Хаскель, Лисп. Понравилось, тем более, что есть такая библиотечка, как InteLib, которая предоставляет нам возможность использовать ряд функциональных языков в почти что полном объеме прямо в С++. Реализовна как раз на шаблонах. Минус большой, при ошибке в синтаксисе функционального языка мы получаем столько шаблонногоБреда от компилятора, что жесть.

    >Вы осилили буст и решили этим похвастаться? ))
    буст до конца не осилил, там же более 80 компонентов! Что-то использовал, что-то нет.

    >Но еще раз хочу сказать все это несколько далеко от реальности.
    Соглашусь в том смысле, что редко это где применяется. Не пойдешь устраивать на работу, навязывая свои template подходы.

  5. 18
    Николай Митропольский ответил:

    Александр ev Новиков,
    Вам в каком виде?

    //www.ozon.ru/context/detail/id/2457392/

    сойдет?

  6. 17
    Дмитрий Иванов ответил:

    > а можно ссылку на банду четырех?)
    //www.rsdn.ru/res/book/oo/design_patterns.xml

  7. 16
    Николай Митропольский ответил:

    > Не пойдешь устраивать на работу, навязывая свои template подходы.
    Да и главное очень трудно поддерживать код. Нет в шаблонах С++ такой элегантности как в том же Хаскеле, получается огород из темплейтов в которой не то что командной разработке…самому даже толком не разобраться иногда что написал.

  8. 15
    Николай Митропольский ответил:

    Дмитрий Иванов, эк вас понесло.
    Вы осилили буст и решили этим похвастаться? ))
    Круто) могу посоветовать почитать про Хаскель – вам должно понравиться)

    Но еще раз хочу сказать все это несколько далеко от реальности.

  9. 14
    Дмитрий Иванов ответил:

    >А огромный свитч.. я хоть и далек от с++ но помоему смысл хорошего тона сводится именно к тому, что бы не было этого огромного свитча или кучи операторов иф элс, а было ооп и полиморфизм.

    Я и не говорю, что так ВСЕГДА надо делать. Замечу, что мегасвитч вполне можно написать всего один для всего семейства классов и работает такой вариант значительно быстрее… Что касается блоков if else, то они при большом колчестве смежных вариант работают медленнее мегасвитча.

    Что касается хорошего тона. В каких используемых ныне языках, кроме С++, есть шаблоны. Недалекие программисты предложат мне generic'и в паре известных языков. Но это же совсем разные вещи!
    А раз шаблоны есть только в С++, то очевидно, что в общих правилах хорошего тона они не могут быть описаны.

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

  10. 13
    Александр Новиков ответил:

    вообще не понимаю причем тут александреску с его дизайном… причем тут буст. точно так же можно приплести сюда stl.
    А огромный свитч.. я хоть и далек от с++ но помоему смысл хорошего тона сводится именно к тому, что бы не было этого огромного свитча или кучи операторов иф элс, а было ооп и полиморфизм.
    да и вообще посмотрите год издания александрески, современным его уже никак не назовешь, но идеи там есть, помимо стандартных шаблонов – тех же синглетонов, декораторов и прочих

  11. 12
    Дмитрий Иванов ответил:

    Вообще, я уже полгода как подсел на метапрограмминг и пока имею вот какие плюшки:

    Первая плюшка:
    Есть большая информационная система из кучи плагинов, каждый из который выполняет свои функции. Так вот оказалось, что для каждого плагина вполне достаточно описать структуры данных, а обработка этих структур выпоняется автоматически. Если бьть точным, то автоматически генерируется код за счет использования templates и программист его не видит, что не мешает его отлаживать.
    Автоматически обрабатывается ряд типовых операций. Что характерно, классы в плагине в качестве полей могут также иметь нетривиальные классы, но обработка все равно происходит автоматически.
    Вся эта идея отчасти напонимает шаблонную сериализацию в бусте. В начале я и написал свои сериализаторы… А потом оказалось что и автоматическая обработка типовых операций тоже несложна.

    Вторая плюшка:
    Сериализация вначале происходила в xml, потом была дописана в бинарный формат и в запросы СУБД. А потом было немного подумано, и добавлены сериализаторы еще в html+javascript.

    В качестве третьей плюшки скажу, что несложной оказалось реализация таблицы в С++, которую можно индексировать разными способами (хэш, бинарное балансированное дерево) по разным полям или их комбинации.

    К примеру, пусть есть
    class foo1

    class foo2
    {
    DWORD dwTraffic;
    foo1 field;
    Stringname;


    };

    Так вот, таблица объявляться будет так
    Table<foo2> table;

    У класса foo2 подразумевается объявленным и описанным метод template<typename Handler> static VOID IndexCreate(Handler& handler)
    {
    handler.CreateIndex<Тип_индексирования>(поле_или_комбинация_полей);
    и так столько индексов, сколько нужно.
    }

    Вообще примеров можно привести уйму.

    Очень много литературы по теме на английском языке, причем достаточно современной, в отличии от первооткрывателя Александреску.
    Скажем, можно посмотреть работы Гуртового (Alex Gurtovoy).

  12. 11
    Дмитрий Иванов ответил:

    Если в кратце, то метапрограммирование(я сейчас имею ввиду только шаблоны) по сути, предоставляет примерно те же возможности, что и ООП, только работает быстрее.

    Да-да, виртуальные функции можно заменить одним большим мегасвитчем. Подчеркиваю, ОДНИМ для описываемого семейства типов.

    Безусловно, это не значит, что надо отказываться от ООП. Часто ОПП проще в обращении и почти не проигрывает во времени. Но в моей практике встречались случаи, когда способы Александреску оказывались гибче в использовании.

    Собственно, основными его идеями является вот это:
    template<DWORD value> struct Int2Type
    {
    enum {Type = value };
    };

    template<typename ValueType> struct Type2Type
    {
    typedef ValueType Type;
    };

    Остальное у него реализовано явно не в лучшей форме. Если эта тема оказалось интересной, то лучше обратиться к описанным выше компонентам буста и посмотреть их реализацию.

    Что касается вспомогательных ресурсов по метапрограммированию, то можно глянуть solarix.ru там не мало уделено вниманию этому вопросу.

  13. 10
    Дмитрий Иванов ответил:

    >Но идеи Александреску для С++ по большей части выглядят как костыли, реальной свободы обобщенного программирования всеравно не ощутишь, да и не юзают её особо в С++. Не воспринимайте Александресу очень серьёзно, его "современный дизайн" довольно далёк от реального современного дизайна – всё в С++ куда прозаичнее и неудобнее.

    В Boost перешли многие идеи Александреску, а Boost используется программистами С++ гораздо чаще, чем сама билиотека loki, что написал Александреску и, что представлена у него в книге.

    Недоброжелатели сразу попросят привести примера острого Александрескита в бусте. Так вот, концептуально очень похожи несколько подбиблиотек метапрограммирования:

    Template Metaprogramming
    * Function Types: Boost.FunctionTypes provides functionality to classify, decompose and synthesize function, function pointer, function reference and pointer to member types.
    * Fusion: Library for working with tuples, including various containers, algorithms, etc.
    * MPL: The Boost.MPL library is a general-purpose, high-level C++ template metaprogramming framework of compile-time algorithms, sequences and metafunctions. It provides a conceptual foundation and an extensive set of powerful and coherent tools that make doing explict metaprogramming in C++ as easy and enjoyable as possible within the current language.
    * Proto: Expression template library and compiler construction toolkit for domain-specific embedded languages.
    * Static Assert: Static assertions (compile time assertions).
    * Type Traits: Templates for fundamental properties of types.

    Preprocessor Metaprogramming
    * Preprocessor: Preprocessor metaprogramming tools including repetition and recursion.

    Для многих других компонентов буста также используются подходы, описанные в Александреску.

    Следует также отметить, что в книге Александреску есть много материала не по метапрограммированию, например, аллокатор для маленьких объектов. Оказывается, что Александреску не в теме метапрограммирования не является лучшим специалистом, потому читать неМетаПрограммирование в его книге не рекомендую.

  14. 9
    Николай Митропольский ответил:

    Ну вообще конечно шаблонный класс у которого параметризуется предок – это вам не хухры-мухры, жава-программисту такое в голову бы не пришло. Александреску хорош в плане расширения сознания в области обобщенного программирования, в жаве с её недогенериками такого не сделаешь.
    Но идеи Александреску для С++ по большей части выглядят как костыли, реальной свободы обобщенного программирования всеравно не ощутишь, да и не юзают её особо в С++. Не воспринимайте Александресу очень серьёзно, его "современный дизайн" довольно далёк от реального современного дизайна – всё в С++ куда прозаичнее и неудобнее.

  15. 8
    Александр Новиков ответил:

    это паттерн из Александреску "Современный дизайн с++"
    яву знаю, решил наверстывать забытое со 2ого курса по с++, тяжело)) столько разных фич ложится на плечи программиста,о которых в яве привык не думать вообще))

  16. 7
    Николай Митропольский ответил:

    Константин Конашенков,
    Вот я не понимаю… код предоставлен – неужели вы сами не можете ответить себе на вопрос паттерн это или не паттерн?

  17. 6
    Константин Конашенков ответил:

    Да, надо было смайл ставить. Дело в том, что в Java Singleton – такой паттерн

  18. 5
    Николай Митропольский ответил:

    Синглтон что в жаве, что ни в жаве – это синглтон. Да, его принято считать паттерном.

    Другой вопрос чтов жаве он будет выглядеть подругому.

  19. 4
    Константин Конашенков ответил:

    Говорил, про само название, а не реалиацию

  20. 3
    Константин Конашенков ответил:

    Singleton а это случаем не паттерны пошли ?

  21. 2
    Александр Новиков ответил:

    ой блин.. вот это я ламер)))) привык, что в яве надо писать extends ))

  22. 1
    Николай Митропольский ответил:

    Наследование
    //ru.wikipedia.org/wiki/Наследование_(программи...

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.