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

    +32

    1. 1
    static_cast<SomeOtherClass>(this)->SomeMethod();

    Чуваки лучше знают, что у них в this

    Запостил: bazhenovc, 31 Августа 2012

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

    • Кастрация из указателя в объект? Как-то непревычно... Наверное там было *this...
      -----
      Далее следует развёрнутая дискуссия о пользе static_cast
      Ответить
      • Опечатался, конечно же SomeOtherClass*
        Ответить
        • Видимо, SomeOtherClass - предок. Если метод невиртуальный, то это эквивалентно SomeOtherClass::SomeMethod()
          Разве что какая-нибудь тонкость, но сложно придумать пример.
          Ответить
          • Нет, наследник
            Ответить
            • Суровый код. Не боятся, что у этого класса может чего-то не хватить?
              Ответить
              • Не-а, это уже много лет в продакшене
                Ответить
                • А оно вообще компилируется? Если class Derived : Base, то по правилу, приведенному ниже (спасибо Борманду):
                  //Base *this;
                  Derived *p(this);

                  Впрочем, http://ideone.com/opMF7
                  Что-то пока не понял.
                  Ответить
                  • http://ideone.com/7kDO6
                    Ответить
                  • Статик каст всегда работал в обе стороны - как к Base, так и к Derived. Просто в нем, в отличие от dynamic_cast нет рантайм-проверки. Поэтому каст Base в Derived в общем случае является undefined behavior.

                    Поведение каста из Base в Derived определено только в одном случае - когда исходный объект на самом деле Derived (или его потомок), который кастанули в Base.
                    Ответить
                    • А, в данном случае другой пункт действует, не нижеприведенный. Все понял.
                      Пора отучаться приводить типы скобками.
                      Ответить
                      • Да, там чуть ниже есть пункты про касты из B* в D*.
                        Ответить
    • static_cast<A>(*this)
      error: no matching function for call to ‘A::A(B&)’

      static_cast<A*>(this)
      error: invalid static_cast from type ‘B* const’ to type ‘A*’
      Ответить
      • Стандарт C++ 98, 5.2.9 "Static cast", в пункте 2 гласит:
        An expression e can be explicitly converted to a type T using a static_cast of the form
        static_cast<T>(e) if the declaration “T t(e);” is well-formed, for some invented temporary variable t (8.5). The effect of such an explicit conversion is the same as performing the declaration and initialization and then using the temporary variable as the result of the conversion.


        Пример каста из указателя в объект:
        http://ideone.com/gNxPQ

        Пример каста из объекта в указатель:
        http://ideone.com/h33dM
        Ответить
        • Мне сейчас хочется борманда заплюсовать, а страуструпа - заминусовать.
          Ответить
          • А Страуструпа то за что минусовать?
            Ответить
            • >Стандарт C++ 98
              Да, страуструп тут уже не при делах.
              Ответить
              • Так он еще живой, значит всяко при делах.
                Ответить
                • Слышал, что Дохлыйстраус иногда уже и на заседания коммитета не ходит, а если ходит, то его старческие бредни все равно не слушают.

                  Степанов, что создал знаменитую изрядно нашумевшую STL, темболее туда не ходит. Даже открещивается от того, что её создал. Говорит, что С++ и в особенности стл спроектированы изрядавон плохо. Ему даже стыдно за себя в молодости и своих калл ег.
                  Ответить
                  • Кстати, Степанов уже профессор и один из тех, кто считает, что О ОП провалился.

                    ЧИТАТЬ ДАЛЬШЕ>>>
                    Ответить
                    • у вас href оторвался
                      Ответить
                      • Я уже это говорил, не вижу смысла повторяться:
                        http://govnokod.ru/11683#comment152573
                        Ответить
                      • Пропылесось печеньки обозревателем.
                        Ответить
                        • Тем пылесосом, что на лиспе написан?
                          ЧИТАТЬ ДАЛЬШЕ>>>
                          Ответить
                          • Для тех, кто так и не смог пропылисосить печенки, он обсуждался где-то там:
                            http://govnokod.ru/11683#comment152571
                            Ответить
    • Хм... Может это такой извращенский ход, для вызова метода класса родителя? Ну не знают люди об том что p->baseClass::method();
      Ответить
      • С точностью до наоборот. Это эмуляция виртуального метода.
        Ответить
    • этот прием часто используется при подмешивании и обращениям к подмешанным классам из других подмешанных классов. если приведение недопустимо, будет ошибка компиляции
      вот пример http://ideone.com/gIx5D
      Ответить
      • > при подмешивании и обращениям к подмешанным классам из других подмешанных классов
        but we need to go deeper
        Ответить
      • КРЕСТОМИКСИНЫ
        Ответить

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