Кресты / Говнокод #12695 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
class ANameCreator
{
public:
            virtual void Create(const std::string& /*name*/)
            {
                throw std::runtime_error("<ANameCreator::Create()> : abstract method stub call");
            }
};

Запостил: odeni odeni, (Updated )

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

    • Х.з. разумно бы объявить этот метод как pure virtual. Тогда о попытке вызова ANameCreator::Create() узнавали бы на этапе компиляции, а не в рантайме.

      P.S. Разве что автор очень любил вызывать виртуальные методы из конструкторов/деструкторов и по ночам ему снились pure virtual function call'ы, поэтому он написал код именно так, а также отловил и заглушил std::runtime_error вылетающий из этого метода, чтобы никто никогда не догадался о серьезном баге в программе, и о его неразделенной любви к вызову чего-попало из конструктора...
      Ответить
      • > Разве что автор очень любил вызывать виртуальные методы из конструкторов/деструкторов и по ночам ему снились pure virtual function call'ы

        А кресты сами не кинут исключение в этом случае? Я вроде читал, что должны.
        Ответить
        • Вызов pure virtual function - это UB. Свинья кресту не товарищ и кресты никому ничего не должны. Чтобы избежать UBогости, то для pure virtual function можно определить реализацию:
          struct T
          {
              virtual void pure_virtual_function(void)=0;    
          };
           
          void T::pure_virtual_function(void)
          {
              
          }
          http://ideone.com/YOZNow
          Ответить
            • А что вас смущает?
              virtual void pure_virtual_function(void)=0;
              Означает, что функцию pure_virtual_function обязательно должен переопределить наследник, это не означает, что у неё нет реализации. Так часто делают с виртуальными деструкторами.
              Ответить
          • Эта фишка не для того. Такую хрень, емнип, пишут чтобы не только заставить перекрыть этот метод в потомке (=0), но и предоставить ему какую-нибудь дефолтовую реализацию (в данном случае потомок может может вызвать T::pure_virtual_function()).

            Ну и есть такая идиома как pure virtual destructor, чтобы сделать класс, в котором ничего кроме этого деструктора нельзя объявить как pure virtual.

            А от аборта это не спасёт 😉
            Ответить
              • Спасем тонущий корабль: https://ideone.com/AMW0j6. Гцц онли, для визуалки нужен другой хак.

                Pure-virtual с реализацией: https://ideone.com/YHynrS. Если раскомментить вызов test() в конструкторе - будет тоже самое, что и без реализации.
                Ответить
                • Как-то немного перекликается с чисто виртуальным деструктором, но в явной форме.
                  Ответить
            • Ты одновременно прав и не прав:
              http://ideone.com/feKEPO
              http://ideone.com/z3lxyE
              http://ideone.com/yk2nR5

              #include <iostream>
               
              using namespace std;
               
              struct T
              {
                  int a;
                  T():a(this->pure_virtual_function())
                  {
                      this->pure_virtual_function();
                  }
                  virtual int pure_virtual_function(void)=0;
              };
               
              int T::pure_virtual_function(void)
              {
                  return 0;
              }
               
              struct TT: T{int pure_virtual_function(void){return 0;}};
               
              int main() {
                      TT t;
                      return 0;
              }
              И никакого аборта.
              Ответить
              • Да что ты с этим UB'ом возишься. UB он на то и UB, чтобы вызывать баттхерты:
                https://ideone.com/d3u0JP
                https://ideone.com/JJlbot

                А грань достаточно тонка: http://ideone.com/D2gMSh. Причем этот случай с промежуточной функцией он как раз реалистичней. Специально никто не будет вызывать pure virtual из конструктора, а вот случайно, через другую функцию - запросто.
                Ответить
                • Жестко. Я думал, что создатели компиляторов стараются всегда UB одного класса решать одинаково.
                  Ответить
                  • Фишка в том, что промежуточная функция содержит настоящий виртуальный вызов (ведь ее потом может вызвать кто-то еще). Поэтому здесь мы получаем ошибку в рантайме.

                    А вот вызов виртуального метода из конструктора оптимизируется в прямой вызов (т.к. и так понятно что именно вызывается, зачем лишние разадресации?), поэтому здесь все работает. Кстати gcc выдает ворнинг pure virtual «virtual int T::pure_virtual_function()» called from constructor если вызвать pure virtual метод не выпендриваясь с вызовом через this.

                    P.S. Но в любом случае все это слишком сильно зависит от реализации, фазы луны и настроения компилятора. Поэтому не стоит вызывать виртуальный метод (или метод, способный его вызвать) из конструктора\деструктора. Даже если он не pure virtual, вызовется метод текущего класса или предков, но не потомка, а это скорее всего совсем не то, что хотели добиться...
                    Ответить
                    • Мне иногда кажется, что Борманд самый умный на говнокоде. Даже Diff eceistra делает по крестам или Романа по всему.
                      Ответить
                      • На деле у Романа и Дефекейта опыта всяко больше чем у меня. Просто здесь же далеко не весь спектр знаний можно разглядеть...

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

                        Кресты, как язык, я знаю неплохо. А вот в std и boost я практически полный ноль, т.к. кресты юзал по началу как "сишку с классами", а затем совместно с кутишкой, и из std знал только контейнеры, стримы, да десяток алгоритмов. Начал восполнять этот пробел, понемногу полистывая "The C++ Standard Library: A Tutorial and Reference".

                        Ну и по опыту жабоебства Роман, Лур и 3.14159265 меня запросто порвут, ибо мой жабопыт состоит из пары прог под J2ME, написанных лет 8 назад, подпиливания клиента Haven&Hearth и, с недавнего времени, пары программ под ведро - одной серьезной под заказ и одной игрушечной (говнотифи, которое ты наверное видел).
                        Ответить
                        • stl маленькая либа
                          а насчет буста - там немного библиотек, с нюансами которых надо знакомиться/набивать руку, обычно достаточно гугла "c++ boost whatever", чтобы за 10 минут найти исчерпывающую инфу по конкретной проблеме, либо понять, что в бусте-то этого нет

                          опыт набивается быстро, если есть интересный и не очень тривиальный проект - challenge

                          надо лишь менять место дислокации в более крупный город с бОльшими возможностями, а работу в нем ты найдешь без труда

                          кстати, удивлен ценами на квартиры в киеве - дешевле, чем даже в новосибирске
                          Ответить
                          • > stl маленькая либа
                            > а насчет буста - там немного библиотек
                            Вижу, что провоцируется крестосрач
                            Ответить
                            • > там немного библиотек, с нюансами которых надо знакомиться/набивать руку
                              Не вырываем из контекста, мистер Трололо.
                              Ответить
                            • ну а что такого непостижимого в stl?
                              там материала на методичку:
                              18 Language support library
                              19 Diagnostics library
                              20 General utilities library
                              21 Strings library
                              22 Localization library
                              23 Containers library
                              24 Iterators library
                              25 Algorithms library
                              26 Numerics library
                              27 Input/output library
                              28 Regular expressions library
                              29 Atomic operations library
                              30 Thread support library

                              в бусте же зачастую утилитарные строительные блоки, далеко не каждая первая там библиотека - фреймворк в себе, требующий навыка с ним, памяти о заботливо расставленных граблях
                              и да, я не хочу сказать, что я пользовался всеми библиотеками из буста, но большинство из тех, чем пользовался - просты в употреблении с первой ложки
                              Ответить
                      • Провоцируешь писькомерство, @LispGovno?!
                        Не надейся, никто не поведётся.

                        А поработать с бормандом в одной команде я бы не отказался.
                        Ответить
                              • К предложению @Романа . Работа у нас интересная, условия вкусные, крутые специалисты ценятся.
                                Ответить
                                  • >А HaskellGovno возьмете?
                                    А почему тебя это интересует? Не отвечай сразу. Пускай аноны выдвинут несколько теорий. Я их развею, а ты подтвердишь.
                                    Ответить
                        • > Не надейся, никто не поведётся.
                          ЛиспГовно открыл мне глаза... Раньше я не понимал этого, и считал себя обычным человеком... Но теперь я осознал, что я - Великий и Всемогущий Борманд, представитель расы Избранных, затмевающий облака и солнце подошвами своих сапог. А вы все ничтожные и глупые муравьи, которых я уничтожу вместе с вашей никому не нужной планетёнкой. [зловещий смех]Му-ха-ха-ха...[/зловеший смех]
                          Ответить
                          • А если серьёзно, собеседование обеспечить можно без проблем.
                            Только вот Нижний по сравнению с СПБ - большая деревня, а цены на новое жильё как в Москве. Погода, правда, в среднем лучше.
                            Ответить
                            • > А если серьёзно, собеседование обеспечить можно без проблем.
                              Спасибо, добавлю НН в список потенциальных городов.
                              Ответить
                            • ну судя по http://www.domostroynn.ru/search.html (первая попавшаяся ссылка на гугл "новостройки нижний новгород") всё же не как в москве
                              я бы вот не отказался, если бы в москве такие цены были, например
                              Ответить
                              • В центре до сотни с лишним за квадрат доходит, но с Москвой я действительно погорячился.
                                Ответить
                        • Я бы Борманда взял к себе в штаты, кроме шуток. Но в нашей деревне программисты н***й никому не нужны и крестушки реально программируют за еду. Рядом ко ко со мной сидит скотрудник C++\CLI\C# с 2мя годами или даже больше стажа и получает чуть больше 8к.р. 🙁
                          Та и у меня не намного больше (лишь в 2 раза). Хотя я лишь крестушок. Если скажу, что немного знаю Haskell то меня просто закрестушат.
                          Ответить
                        • Борманд очень позитивный и трудолюбивый парень. Разбирается сходу со всем. Я бы даже не отказался узнать его имя отчество, чтобы называть его уважительно.
                          Ответить
                          • Борманд, самая главная книга по программированию, что ты знаешь и которую нужно обязательно прочитать? Может какие-то ещё книги? Как ты вообще готовишь себя к великим свершениям в программировании? У тебя есть планы или мечты? Как думаешь, чем обусловлен твой высокий уровень подготовленности? Какая-то система подготовки?
                            Ответить
                            • Почитай "совершенный код" Макконнелла, если еще не читал.

                              Фундаментальное по алгоритмам/структурам данных - читал лет 10 назад Кнута и Вирта, не читал, но слышал хорошие отзывы о книгах Ахо и Кормена.

                              Насчет многопоточности - хорошая книга Java concurrency in practice. Она хоть и жабья, но многие принципы, описанные там, вполне универсальны.

                              По крестам могу предложить интересную книжку с уклоном в практику - Imperfect C++.
                              Ответить
        • Согласно стандарту это UB: Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined. Поэтому исключение не гарантируется, и, в большинстве случаев, прога просто делает харакири.

          Прога, скомпиленная gcc, в такой ситуации вызывает __cxa_pure_virtual которая сразу же делает аборт. В вижуалке, если я правильно понимаю доку (не тестил), можно засунуть свой обработчик при помощи _set_purecall_handler, но по дефолту тоже аборт.
          Ответить
    • Видимо, автор имел длительные отношения с Java или C#, где такие вещи зачастую генерируются средой.

      Но плюсую: это хардкор даже в качестве дебаг-инструмента.
      Ответить
  • Abstract method is term, that proposed by MS or Sun. Abstract class is correct, but not abstract method. Recommended use term pure virtual method.
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8