Кресты / Говнокод #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