1. C++ / Говнокод #11624

    +19

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    ??=include <iostream>
     
    template <typename T> class TSingleton: public T
    ??<
       public:
          static T& instance(void)
          ??<
             static T instance;
             return instance;
          ??>;
    ??>;
     
    class TOscillStatisticko
    ??<
       protected:
            TOscillStatisticko(void):_countNewInSmallPool(0), _countDeleteInSmallPool(0) ??<??>;
            
            friend class TSingleton <TOscillStatisticko>;
     
       private:
          int _countNewInSmallPool;
          int _countDeleteInSmallPool;
     
       public:
          void addCountNewInSmallPool(void)
          ??<
             _countNewInSmallPool++;
          ??>
     
          int countNewInSmallPool(void)
          ??<
             return _countNewInSmallPool;
          ??>
    ??>;
     
    typedef TSingleton <TOscillStatisticko> TOscillStatistic;
     
    int main() 
    ??<
        TOscillStatistic::instance().addCountNewInSmallPool();
        std::cout<<TOscillStatistic::instance().countNewInSmallPool()<<std::endl;
        std::cout<<"ko"<<std::endl;
    ??>

    http://ideone.com/dt9L9
    Ладно, раз уж я так палюсь, то придется признаться: у меня просто сломалась клавиатура, потому сегодня пришлось написать немного странно...
    Так вот вопрос:, почему, если закомментировать строку

    friend class TSingleton <TOscillStatisticko>;
    http://ideone.com/4WBGh

    Запостил: HaskellGovno, 20 Августа 2012

    Комментарии (32) RSS

    • - не работает?
      (Это продолжение не законченного вопроса)
      Ответить
    • объясните танкисту что это такое ??<
      Ответить
      • ??< eq {
        ??> eq }
        ??= eq #
        etc
        Ответить
      • Триграфы
        http://alenacpp.blogspot.com/2006/02/blog-post.html
        Ответить
      • Вы на вопрос лучше ответьте, а не задавайте свои. Все эти триграфи и диграфы - детский сад. Ну сломалась клава и че. Я просто разбил её об голову врага и еле собрал обратно. Вот куплю новую и снова буду писать не троллерный говнокод. Я же коплю с использованием денег, что остались с завтрака в школе, так что это понятное дело не быстрое. Мне даже Хаскелл пришлось забросить, тк триграфоф и диграфоф там похоже нет. (

        Вообщем, почему без френдения этот код не компилируется? он ведь должен, тк конструктор TOscillStatisticko protected и проблем быть не должно. Он должен быть виден в TSingleton::instance
        Ответить
        • > Вообщем, почему без френдения этот код не компилируется?
          > конструктор TOscillStatisticko protected
          Внимательно читаем в мане, кому именно доступны protected члены, и больше не задаем тупых вопросов.
          Ответить
          • protected члены TOscillStatisticko доступны потомкам TOscillStatisticko, а TSingleton<TOscillStatisticko> как раз потомок TOscillStatisticko. Все очевидно должно работать
            Ответить
            • > TSingleton<TOscillStatisticko> как раз потомок TOscillStatisticko
              ЩИТО? Как этот самозванец посмел назваться потомком TOscillStatisticko.
              Ответить
              • Он от него отнаследован!
                template <typename T> class TSingleton: public T
                typedef TSingleton <TOscillStatisticko> TOscillStatistic;
                Ответить
                • Позволю себе процитировать стандарт c++98 11.5 Protected member access.
                  Except when forming a pointer to member (5.3.1), the access must be through a pointer to, reference to, or object of the derived class itself (or any class derived from that class) (5.2.5).
                  Ответить
                  • Как у вас получается так гуглить строки из стандарта? Может я говнокод терроризировать даже перестану, если научусь. Я как-то перед девушкой-однокласницей хотел попонтоваться и начал спорить о стандарте и естественно слил. Как вы это делаете? Станьте моим сенсеем! Молю!
                    Ответить
                    • - Качаем стандарт
                      - Открываем его
                      - Ищем в содержании нужный раздел
                      - Читаем
                      - ?????
                      - Профит
                      Ответить
                      • Как то глуповато я задал вопрос... Я переформулирую вопрос позднее, когда собирусь с мыслями.

                        Но для начала задам вопрос попроще:
                        Где найти абсолютно финальный стандарт С++11 (не черновики, доступные каждому за бесплатно). Я знаю что его нужно покупать у комитета стандартизации, но может кто знает торрент или что-то подобное, чтобы это было за бесплатно? С моих школьных завтраков столько не накопить... Мне вон щас на клаву придется и без того копить.
                        Ответить
                        • Загугли "ISO/IEC 14882:2011". У меня прям первая ссылка на нужный ресурс, даже iso.org на второе место выпал.
                          Ответить
                          • Вы уже проверяли? Там точно не устаревшая бесплатная версия? Но спасибо, ага. :)
                            Ответить
                • ноги растут вот из этого простого примера
                  http://ideone.com/38T7a
                  Ответить
                  • bormand
                    defecate-plusplus

                    Спасибо друзья. Я осознал свою ошибку. Я так больше не буду. :-(
                    Жаль, что так делать нельзя...

                    То есть к protected членам можно обратиться только через this и типа того и больше никак.
                    Ответить
                    • Через любой указатель (в частности this), ссылку или сам объект дочернего класса. Но не базового.

                      P.S. См. код BizarreSingleton ниже.
                      Ответить
                      • Чем этот синглтон сранный? По моему это весьма правильная реализация. Вот даже в буст все ещё не добавили синглтоны. Только в составе detail, что уже можно считать не применимым в реальных проектах. Мне тут посоветовали библиотеку Loki для использования синглтонов оттуда. Как вам идея?
                        Ответить
                        • слухи о всенепременной пользе синглтонов обычно несколько преувеличены
                          только доза делает лекарство ядом и яд лекарством
                          Ответить
                          • Я к сожалению пока не умею контралировать дозу и часто получаю передоз или белочку
                            Ответить
                            • как по мне, так синглтон необходим только тогда, когда без него никак (см например boost::system::get_system_category())
                              а для случаев "мне лениво передавать ссылку на этот объект в 0-5-10-30% создаваемых других объектов, пускай он будет глобальной переменной, ой, в смысле, синглтоном" - ну тут надо принимать во внимание фактор лени, конечно, но обычно всё неплохо кодится и без таких синглтонов
                              мне видится проблема из ОП как раз вторым случаем (какой-то сбор статистики, пф, еще запрет на переопределение operator = в потомке от этой статистики - задача первой важности, да)
                              Ответить
                    • ладно, наброшу
                      http://ideone.com/qmyao

                      чорт, борманд уже накинул раньше
                      Ответить
                      • Да, спасибо. Я понял свою очередную ошибку... Почему я так часто ошибаюсь? Может есть секрет, как этого избежать?
                        Ответить
                • Можно, в принципе, вот так извратиться:
                  http://ideone.com/sDbbE
                  Ответить
                  • А ты соображаешь, молодец. :)
                    Я sosnuley... :(
                    Ответить
                  • Я копипастил скобочки из чужого кода:
                    У меня получилось 2 финальных варианта:
                    http://ideone.com/bPjsF
                    ??=include <iostream>
                     
                    class TNoCopyable
                    {
                       private:
                            TNoCopyable(const TNoCopyable&);
                            const TNoCopyable& operator=(const TNoCopyable&);
                       protected:
                            TNoCopyable(void){};
                            virtual ~TNoCopyable(void){};
                    };
                     
                    template <typename T> class TSingleton: public T
                    ??<
                       private:
                            TSingleton(const TSingleton&);
                            TSingleton(void){};
                            const TSingleton& operator=(const TSingleton&);
                       public:
                          static T& instance(void)
                          ??<
                             static TSingleton instance;
                             return instance;
                          ??>;
                    ??>;
                     
                    class TOscillStatisticko:private TNoCopyable
                    ??<
                       protected:
                            TOscillStatisticko(void):_countNewInSmallPool(0), _countDeleteInSmallPool(0) ??<??>;
                            
                    //        friend class TSingleton <TOscillStatisticko>;
                     
                       private:
                          int _countNewInSmallPool;
                          int _countDeleteInSmallPool;
                     
                       public:
                          void addCountNewInSmallPool(void)
                          ??<
                             _countNewInSmallPool++;
                          ??>
                     
                          int countNewInSmallPool(void)
                          ??<
                             return _countNewInSmallPool;
                          ??>
                    ??>;
                     
                    typedef TSingleton <TOscillStatisticko> TOscillStatistic;
                     
                    int main() 
                    ??<
                        TOscillStatistic::instance().addCountNewInSmallPool();
                        std::cout<<TOscillStatistic::instance().countNewInSmallPool()<<std::endl;
                        std::cout<<"ko"<<std::endl;
                    ??>
                    Ответить
                    • http://ideone.com/PHxIO
                      #include <iostream>
                       
                      using namespace std;
                       
                      template <typename T> class TSingleton
                         {
                         public:
                            static T& getInstance(void) 
                            {
                               static T instance;
                               return instance;
                            };
                         private:
                                      TSingleton(const  TSingleton&);
                                      void operator=( const TSingleton& );
                         protected:
                            TSingleton(void){ }
                            virtual ~TSingleton(void) { }
                       
                         };
                       
                      class TOscillStatistic: public TSingleton<TOscillStatistic>
                         {
                         private:
                       
                            int _countNewInSmallPool;
                            int _countDeleteInSmallPool;
                       
                                friend class TSingleton<TOscillStatistic>;
                       
                              protected:
                                TOscillStatistic(void):
                                      _countNewInSmallPool(0),
                                      _countDeleteInSmallPool(0)
                                {
                                }
                         public:
                       
                       
                            void addCountNewInSmallPool(void)
                            {
                                        _countNewInSmallPool++;
                            }
                            int countNewInSmallPool(void)
                            {
                                        return _countNewInSmallPool;
                            }
                                void addCountDeleteInSmallPool(void)
                            {
                                        _countDeleteInSmallPool++;
                            }
                            static int countDeleteInSmallPool(void)
                            {
                                        return getInstance()._countDeleteInSmallPool;
                            }
                         };
                       
                       
                      int main() {
                              TOscillStatistic::countDeleteInSmallPool();
                              return 0;
                      }

                      Из второго мне не удалось убрать friend, хотя мне он нравится больше. Есть идеи, как убрать френда из второго варианта?
                      А вообще реально спасибо, идея была реально гениальная bormand!
                      Ответить
                      • Да помоему никак не убрать из этого варианта. А оно нужно?

                        В первом варианте обезфренживание имело смысл в том случае, если класс создан не нами, и не хочется\нельзя его править, но синглтон нужен.

                        Во втором варианте класс зависит от синглтона, и т.к. мы уже впилили в его заголовок наследование, френда добавить никаких проблем не составит.
                        Ответить
                        • Да, я тоже ничего умнее дифайна, добавляющего фриенд в класс не придумал. Так что вдимо не убрать. Спасибо за поддержку.
                          Ответить
    • С клавиатурой у вас порядок, а вот
      http://med-magazin.com.ua/item_N829.htm явно поверку давно не проходил.
      Ответить
    • СУКА, ТЫ ЗАЕБАЛ СВОИМИ СРАНЫМИ ТРИГРАФАМИ, КТО МНЕ, БЛЯТЬ, ГЛАЗА НОВЫЕ КУПИТ?
      Ответить

    Добавить комментарий