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

    +16

    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
    #include <functional>
    
    using namespace std;
    
    class O{};
    
    class foo
    {
    public:
       constexpr static auto anyGarbage = O(O(O(O())));//:Жаль, что написать auto anyGarbage = O(O(O(O()))); нельзя.
       O anyGarbage2 = O(O(O(O())));
       
    private:
       int var;
       
    public:
       std::function<void(int)> setter=[this](int s){(void)s;/*var=s;*/};
    };

    Я хочу написать свои property, принимающие лямбды в качестве параметра setter и getter. Как сделать friend лямбду?
    http://liveworkspace.org/code/39082e70108502c2e44c4fe6c5762d9a

    Запостил: USB, 26 Октября 2012

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

    • Если /*var=s;*/ раскоментировать, то будут проблемы.
      Ответить
    • Как вообще в С++ сделать свойства, которые не будут занимать память, которые вообще не будут проявляться никак, кроме как сущность времени компиляции (короче как в нормальных языках)?
      Ответить
      • С++ не умеет в настоящие расчеты времени компиляции и настоящую кодогенерацию. Так что никак.
        Ответить
      • Я вот не понял, что ты имеешь ввиду
        Что значит "не будут занимать память"? вычисляемое поле?
        Ответить
        • http://www.gamedev.ru/flame/forum/?id=168297&page=2
          Ответить
          • Это всё выпендрёж школолоидов.
            Хочется инкапсуляции - напиши геттер и/или сеттер, подумай о людях, которые будут читать твой код.
            Ответить
            • гетеры\сетеры - нудно, неудобно
              не всегда же их писать
              а потом он вдруг понадобился и приходится все обращения к полю переписывать на getter\setter по всему коду
              Ответить
              • ещё дедушка Страуструп и дяденька Майерс писали, что давать доступ к данным-членам - искать неприятностей. Не скажу, что я когда-то особо горевал от отсутствия полей в языке (в жабе, например). Удобно, но не необходимо.
                Ответить
                • Господа минусаторы, поясните, где я обосрался. Мне правда интересно, вдруг я чего-то не понимаю.
                  Ответить
                  • >>а потом он вдруг понадобился и приходится все обращения к полю переписывать на getter\setter по всему коду
                    А потом вдруг! у тебя вместо intа - куда перестали влазить значения появился long.
                    И с полями ты переписываешь весь код.

                    Я сам геттеры с сеттерами, недолюбливаю, если что.
                    Ответить
                    • > http://ideone.com/UvOEfi
                      Это я на хабре с год назад примерно видел, профита я в этом особого не вижу (один хрен нужно геттер и сеттер писать). Разве что как постфактумный костыль.
                      Ответить
                  • >поясните, где я обосрался
                    Походу минусаторы сами слабо предметом владеют. Следует чётко понимать нужны тебе геттеры или нет.
                    Если такого понимания нет - лучше пиши их везде.

                    >у тебя вместо intа - куда перестали влазить значения появился long.
                    Или появилось дополнительное действие которое надо выполнять при изменении поля.
                    И ты снова переписываешь весь свой код.
                    Ответить
                    • В том же питоне всегда можно проапгрейдить поле в свойство. Поэтому там наоборот рекомендуют не писать геттеров, пока они действительно не понадобятся. А насчет явы, с++ и подобных им согласен с вами - тут апгрейд поля в свойство будет сопряжен с ужаснейшим геморроем, поэтому надо писать get/set.

                      > Или появилось дополнительное действие которое надо выполнять при изменении поля.
                      Тут да.

                      > У тебя вместо intа - куда перестали влазить значения появился long.
                      А вот тут геттер и сеттер не спасут. Т.к. и у них придется менять возвращаемый тип, ну и проверять весь код который ими пользовался - не сохранили ли там результат геттера в int.
                      Ответить
                      • Можно написать новый геттер/cеттер для лонга. А старые Deprecate.
                        Если старый код не использует верхние биты, например.
                        Но вообще да, с типами пример не очень удачный.
                        Ответить
                        • > Можно написать новый геттер/cеттер для лонга. А старые Deprecate.
                          А потом получится как в BDE и Windows. В винде добавили функцию для получения свободного места на диске с 64битным результатом, старую пометили как deprecated. Новые программы теперь понимают большие диски. А вот BDE от delphi 7, к примеру, до сих пор при удачно выбранном свободном месте (в районе 4Gb, 8Gb, 12Gb...) выдает "Недостаточно места на диске".

                          Так что необходимость смены типа - это во многих случаях катастрофа...
                          Ответить
                • > Не скажу, что я когда-то особо горевал от отсутствия полей в языке (в жабе, например)
                  Я вот за это минуснул ;) Хотя, конечно, с первой частью фразы согласен.
                  Ответить
              • >гетеры\сетеры - нудно, неудобно
                Скучные_обои.жпег
                Ответить
      • Писать setX(5) и x() и говорить всем что это свойство.
        Ответить
    • хоть пользы от пропертей в с++ я всё равно не вижу, но набросал за 10 минут
      так в чем была проблема с лямбдой?
      http://liveworkspace.org/code/c1f6c811cd8f4655f87086595abea4af

      при желании можно тип проперти прямо в шаблоне указать она r или r+w и в специализации убирать либо получение, либо присваивание (чтобы не рантайм-еррор, а компайлтайм-еррор генерить)
      Ответить
      • Во всех крестоблядских эмуляциях пропертей есть одна проблема - в них либо хранятся коллбеки, либо указатель на объект, к которому они относятся. Поэтому Тарас правильно пишет:
        Как вообще в С++ сделать свойства, которые не будут занимать память, которые вообще не будут проявляться никак, кроме как сущность времени компиляции (короче как в нормальных языках)?
        Ответить
        • Вторая проблема связана с первой и заключается в том, что нужно эти "проперти" инициализировать в своем конструкторе.

          Ну а если этими проблемами пренебречь - то проблем с реализацией никаких, равно как и пользы от этих "свойств".
          Ответить
          • тут нечего возразить
            сделать проперти, не хранящую даже this внешнего класса - т.е. предполагать её модификацию изолированной вещью в себе - значит сделать такую проперти бессмысленной и эквивалентной обычному члену-объекту в классе
            ну а по-другому языковые средства не позволят
            Ответить
            • Да на самом деле проблема свойств надуманная. Написать при вызове две скобки и слово set/get не так уж и долго, да и выглядит оно нагляднее, нежели присваивание.
              Ответить
              • Да вообще открытые поля это зло. Всё должно быть методом. Причём виртуальным.
                Да, и поля должны быть закрыты даже для наследников.
                Во тогда это приблизится к настоящему ооп.
                Ответить
                • Кстати да, именно это и есть настоящее ООП, каким его реализовали в каноническом Smalltalk. Только посылка сообщений, только хардкор.
                  Ответить
      • Код понравился.

        Оффтоп вопрос: в стандартной библиотеке C++ и в boost используется гнушный код-стайл. Но практически все гайдлайны по код-стайлу, которые я видел, советуют использовать совершенно другой стиль (имена классов с большой буквы, методы в кэмел-кейсе, etc). У Страуструпа в книге другой стиль. У Александреску - третий.

        Внимание вопрос: почему программисты так не любят использовать стиль, принятый в стандартной библиотеке C++? Значит ли это, что он был выбран неудачно?
        Ответить
        • Крестопроблемы, сэр.
          Ответить
        • я люблю как раз стиль stl и boost, и мой отдел соответственно тоже (но у них выбора нет:) )
          Ответить
          • Мне тоже близок этот стиль, и гайдлайны меня удивляют (и гугловый гайдлайн туда же...). Единственный недостаток, который я могу предположить - приходится набирать подчёркивания + не всегда понятно, тип перед тобой или метод (хотя с ide таких вопросов не должно возникать).
            Ответить
            • На вкус и цвет товарищей нет...

              Мне больше по душе стиль, который используется в Qt - имена кэмел кейсом - классы с большой, методы с маленькой. Для меня он визуально выглядит приятней, чем обилие подчеркиваний.

              Ну а если весь проект написан в стиле stl, то я конечно добавляю в него новые классы в стиле stl. Все-таки единство стиля важнее личных предпочтений.
              Ответить
              • дело в другом - причина банальна
                Qt это монстр, который сам в себе покрывает функциональность stl своими QSomeThing (не удивлюсь, если там есть и замена built-in типам, навроде QInt или QBool), поэтому смешивание Qt и stl само по себе будет выглядеть инородно (ну кому нужно одновременно QString и std::string)
                а вот когда весь проект написан на stl+boost, примешивание своих Oh::MyGoodness::MyAwesomeString выглядит некрасиво, будь они хоть трижды великолепны
                Ответить
                • > не удивлюсь, если там есть и замена built-in типам, навроде QInt или QBool
                  Да нет, только всякие quint16.

                  > будет выглядеть инородно
                  > выглядит некрасиво, будь они хоть трижды великолепны
                  Так и я о том же :) Все-таки единство стиля важнее личных предпочтений.

                  P.S. Хотя, если автор проекта уже начал его в стиле Oh::MyGoodness::MyAwesomeString, при этом обильно юзая boost и stl... то, имхо, лучше придерживаться стиля автора, дабы не превращать код в еще большую помойку стилей.
                  Ответить

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