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

    +159

    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
    class CVal
    {
    private:
        int m_val;
    public:
        __declspec(property(get=get_Val, put=put_Val)) int Val;
        int get_Val()
        {
            return m_val;
        }
        void put_Val(int val)
        {
            m_val = val;
        }
    };

    Говно в рамках стандарта C++.

    Запостил: Говногость, 10 Мая 2011

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

    • показать все, что скрытоО, сейчас прибежит тарас...
      Ответить
      • Мне вас жаль. Хосни суйцов, быдло.

        Всё, не прибежит.
        Ответить
    • где тут "в рамках стандарта C++" ?
      Ответить
    • какого стандарта?
      __declspec приблуда майкрософта
      Ответить
    • У меня кучка погуще будет:
      template<typename dataT, typename ownerT,
      	typename const dataT& (ownerT::*setter)(const dataT&),
      	typename const dataT& (ownerT::*getter)() const>
      class Property
      {
      private:
      	ownerT * owner;
      	Property() : owner(nullptr)
      	{
      	}
      	Property(const Property& value) : owner(value.owner)
      	{
      	}
      public:
      	const Property& operator=(const Property& value)
      	{
      		if(&value!=this)
      		{
      			(owner->*setter)((value.owner->*getter)());
      		}
      		return *this;
      	}
      	Property(ownerT * const owner) : owner(owner)
      	{
      	}
      	operator dataT()
      	{
      		return (owner->*getter)();
      	}
      	const dataT& operator()() const
      	{
      		return (owner->*getter)();
      	}
      	const dataT& operator=(const dataT& value)
      	{
      		return (owner->*setter)(value);
      	}
      	template<class another_valueT>
      	const dataT& operator=(const another_valueT& value)
      	{
      		throw std::exception("wrong property lvalue");
      	}
      };
      Ответить
      • Тоже делал подобное, но совсем уж высер.
        дельфовое проперти в этом плане удобнее и читабельнее.
        Ответить
        • Этим шаблоном, в отличие от __declspec, можно спрятать в private геттер и сеттер. ИМХО читабельность не сильно ухудшилась.
          Ответить
      • должно быть:
        gownerT * gowner;
        Ответить
        • смотри как бэ минус на минус не дал плюс... :)
          Ответить
      • А эти шаблоном можно передавать свойства по ссылке?
        Ответить
        • конечно можно. это ж отдельный класс.
          Ответить
          • Чтобы при foo(prop) перед передачей в foo вызывался геттер prop во временную переменную, передавалась ссылка именно на неё, а при выходе вызывался сеттер из нового значения этой временной переменной.
            Ответить
            • Нельзя. Но можно передавать в foo ссылку на владельца свойства и вызывать свойство у него (у владельца, переданного по ссылке то есть).
              Ответить
            • А где такое можно вообще? В шарпах например нечто подобное надо уже через рефлексию мутить.
              Ответить
              • Как, в шарпе тоже нельзя? Вот говно. Такая простая вещь же.

                Выходит, что свойства - не более чем бесполезный сахар, никак не сокращающий кол-во кода, ведь какая нахрен разница, писать Color := red или SetColor(res). А чтобы передать 3 параметра по ссылке, я должен руками создать три временные переменные, почувствуй себя ассемблером, блин.
                Ответить
                • Ну а что там в дельфях на этот счет?
                  Сокращения есть + некоторая единообразность, т.к. работаешь почти как с переменной.
                  Ответить
                  • В дельфях та же хрень (по крайней мере в семёрке) - бесполезный сахар. Ну разве что возможность в среде задавать параметры формочек.

                    > Cокращения есть + некоторая единообразность, т.к. работаешь почти как с переменной.

                    Эти сокращения, как бы сказать, на уровне константы, а не порядка. То есть мало что дают.
                    А "работа как с переменной" тут даже минус, поскольку можно нечаянно вызвать нечто, и не заметить этого. Я в обработчиках событий что-то писал такое, что в бесконечную рекурсию уходил и не понимал, почему.
                    Ответить
                • паскалист-свойствоборец
                  Ответить
              • Common Lisp, setfable places?
                Ответить
      • че за говно?

        template<typename dataT, typename ownerT,
        	typename const dataT& (ownerT::*setter)(const dataT&),
        	typename const dataT& (ownerT::*getter)() const>
        class Property
        {
        private:
        	ownerT * owner;
        	explicit Property(ownerT * owner_ = nullptr): owner(owner_)
        	{
                }
        	Property(const Property& value) : owner(value.owner)
        	{
        	}
        public:
        	Property& operator=(const Property& value)
        	{
        	(owner->*setter)(value);
        	return *this;
        	}
        	Property(ownerT * const owner_) : owner(owner_)
        	{
        	}
        	operator dataT &()
        	{
        		return (owner->*getter)();
        	}
        	operator const dataT &() const
        	{
        		return (owner->*getter)();
        	}
        	Property& operator=(const dataT& value)
        	{
        		(owner->*setter)(value);
        	return *this;
                }
        };
        Ответить
    • показать все, что скрытоВъебал всем по плюсу. ;-)
      Ответить
    • Очевидно, что такое не стандартизированное говно применять не стоит.
      Ответить
    • Набери на калькуляторе 0.7811505
      переверни и прочитай.
      Ответить
    • VisualStudio.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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