- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
class ANameCreator
{
public:
virtual void Create(const std::string& /*name*/)
{
throw std::runtime_error("<ANameCreator::Create()> : abstract method stub call");
}
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+23
class ANameCreator
{
public:
virtual void Create(const std::string& /*name*/)
{
throw std::runtime_error("<ANameCreator::Create()> : abstract method stub call");
}
};
P.S. Разве что автор очень любил вызывать виртуальные методы из конструкторов/деструкторов и по ночам ему снились pure virtual function call'ы, поэтому он написал код именно так, а также отловил и заглушил std::runtime_error вылетающий из этого метода, чтобы никто никогда не догадался о серьезном баге в программе, и о его неразделенной любви к вызову чего-попало из конструктора...
А кресты сами не кинут исключение в этом случае? Я вроде читал, что должны.
http://ideone.com/YOZNow
virtual void pure_virtual_function(void)=0;
Означает, что функцию pure_virtual_function обязательно должен переопределить наследник, это не означает, что у неё нет реализации. Так часто делают с виртуальными деструкторами.
Ну и есть такая идиома как pure virtual destructor, чтобы сделать класс, в котором ничего кроме этого деструктора нельзя объявить как pure virtual.
А от аборта это не спасёт ;)
Pure-virtual с реализацией: https://ideone.com/YHynrS. Если раскомментить вызов test() в конструкторе - будет тоже самое, что и без реализации.
http://ideone.com/feKEPO
http://ideone.com/z3lxyE
http://ideone.com/yk2nR5
И никакого аборта.
https://ideone.com/d3u0JP
https://ideone.com/JJlbot
А грань достаточно тонка: http://ideone.com/D2gMSh. Причем этот случай с промежуточной функцией он как раз реалистичней. Специально никто не будет вызывать pure virtual из конструктора, а вот случайно, через другую функцию - запросто.
А вот вызов виртуального метода из конструктора оптимизируется в прямой вызов (т.к. и так понятно что именно вызывается, зачем лишние разадресации?), поэтому здесь все работает. Кстати gcc выдает ворнинг pure virtual «virtual int T::pure_virtual_function()» called from constructor если вызвать pure virtual метод не выпендриваясь с вызовом через this.
P.S. Но в любом случае все это слишком сильно зависит от реализации, фазы луны и настроения компилятора. Поэтому не стоит вызывать виртуальный метод (или метод, способный его вызвать) из конструктора\деструктора. Даже если он не pure virtual, вызовется метод текущего класса или предков, но не потомка, а это скорее всего совсем не то, что хотели добиться...
По низкому уровню (сишка, асм, алгоритмы, архитектура процов) да, у меня неплохая прошаренность. А вот опыта в проектировании архитектуры масштабных проектов мне очень не хватает (т.к. по работе с ними не сталкиваюсь, а для души, естественно, такое не пишут).
Кресты, как язык, я знаю неплохо. А вот в std и boost я практически полный ноль, т.к. кресты юзал по началу как "сишку с классами", а затем совместно с кутишкой, и из std знал только контейнеры, стримы, да десяток алгоритмов. Начал восполнять этот пробел, понемногу полистывая "The C++ Standard Library: A Tutorial and Reference".
Ну и по опыту жабоебства Роман, Лур и 3.14159265 меня запросто порвут, ибо мой жабопыт состоит из пары прог под J2ME, написанных лет 8 назад, подпиливания клиента Haven&Hearth и, с недавнего времени, пары программ под ведро - одной серьезной под заказ и одной игрушечной (говнотифи, которое ты наверное видел).
а насчет буста - там немного библиотек, с нюансами которых надо знакомиться/набивать руку, обычно достаточно гугла "c++ boost whatever", чтобы за 10 минут найти исчерпывающую инфу по конкретной проблеме, либо понять, что в бусте-то этого нет
опыт набивается быстро, если есть интересный и не очень тривиальный проект - challenge
надо лишь менять место дислокации в более крупный город с бОльшими возможностями, а работу в нем ты найдешь без труда
кстати, удивлен ценами на квартиры в киеве - дешевле, чем даже в новосибирске
> а насчет буста - там немного библиотек
Вижу, что провоцируется крестосрач
Не вырываем из контекста, мистер Трололо.
там материала на методичку:
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
в бусте же зачастую утилитарные строительные блоки, далеко не каждая первая там библиотека - фреймворк в себе, требующий навыка с ним, памяти о заботливо расставленных граблях
и да, я не хочу сказать, что я пользовался всеми библиотеками из буста, но большинство из тех, чем пользовался - просты в употреблении с первой ложки
Не надейся, никто не поведётся.
А поработать с бормандом в одной команде я бы не отказался.
К @bormand'у?
Тут помогут с работой
А HaskellGovno возьмете?
А почему тебя это интересует? Не отвечай сразу. Пускай аноны выдвинут несколько теорий. Я их развею, а ты подтвердишь.
ЛиспГовно открыл мне глаза... Раньше я не понимал этого, и считал себя обычным человеком... Но теперь я осознал, что я - Великий и Всемогущий Борманд, представитель расы Избранных, затмевающий облака и солнце подошвами своих сапог. А вы все ничтожные и глупые муравьи, которых я уничтожу вместе с вашей никому не нужной планетёнкой. [зловещий смех]Му-ха-ха-ха...[/зловеший смех]
Только вот Нижний по сравнению с СПБ - большая деревня, а цены на новое жильё как в Москве. Погода, правда, в среднем лучше.
Спасибо, добавлю НН в список потенциальных городов.
я бы вот не отказался, если бы в москве такие цены были, например
Та и у меня не намного больше (лишь в 2 раза). Хотя я лишь крестушок. Если скажу, что немного знаю Haskell то меня просто закрестушат.
скажи, чтобы я туда не вздумал поехать
Фундаментальное по алгоритмам/структурам данных - читал лет 10 назад Кнута и Вирта, не читал, но слышал хорошие отзывы о книгах Ахо и Кормена.
Насчет многопоточности - хорошая книга Java concurrency in practice. Она хоть и жабья, но многие принципы, описанные там, вполне универсальны.
По крестам могу предложить интересную книжку с уклоном в практику - Imperfect C++.
Прога, скомпиленная gcc, в такой ситуации вызывает __cxa_pure_virtual которая сразу же делает аборт. В вижуалке, если я правильно понимаю доку (не тестил), можно засунуть свой обработчик при помощи _set_purecall_handler, но по дефолту тоже аборт.
Но плюсую: это хардкор даже в качестве дебаг-инструмента.
>abstract method
Похоже на то.