- 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");
}
};
Ccik 06.03.2013 11:19 # 0
bormand 06.03.2013 11:28 # +5
P.S. Разве что автор очень любил вызывать виртуальные методы из конструкторов/деструкторов и по ночам ему снились pure virtual function call'ы, поэтому он написал код именно так, а также отловил и заглушил std::runtime_error вылетающий из этого метода, чтобы никто никогда не догадался о серьезном баге в программе, и о его неразделенной любви к вызову чего-попало из конструктора...
Ccik 06.03.2013 16:39 # 0
А кресты сами не кинут исключение в этом случае? Я вроде читал, что должны.
LispGovno 06.03.2013 18:13 # +2
http://ideone.com/YOZNow
Ccik 06.03.2013 18:19 # +1
roman-kashitsyn 06.03.2013 18:49 # +2
virtual void pure_virtual_function(void)=0;
Означает, что функцию pure_virtual_function обязательно должен переопределить наследник, это не означает, что у неё нет реализации. Так часто делают с виртуальными деструкторами.
bormand 06.03.2013 18:47 # +1
Ну и есть такая идиома как pure virtual destructor, чтобы сделать класс, в котором ничего кроме этого деструктора нельзя объявить как pure virtual.
А от аборта это не спасёт ;)
LispGovno 06.03.2013 18:49 # 0
bormand 06.03.2013 19:01 # +2
Pure-virtual с реализацией: https://ideone.com/YHynrS. Если раскомментить вызов test() в конструкторе - будет тоже самое, что и без реализации.
Bart 06.03.2013 22:06 # +1
LispGovno 06.03.2013 19:07 # 0
http://ideone.com/feKEPO
http://ideone.com/z3lxyE
http://ideone.com/yk2nR5
И никакого аборта.
bormand 06.03.2013 19:20 # +2
https://ideone.com/d3u0JP
https://ideone.com/JJlbot
А грань достаточно тонка: http://ideone.com/D2gMSh. Причем этот случай с промежуточной функцией он как раз реалистичней. Специально никто не будет вызывать pure virtual из конструктора, а вот случайно, через другую функцию - запросто.
LispGovno 06.03.2013 20:50 # 0
bormand 06.03.2013 21:11 # +3
А вот вызов виртуального метода из конструктора оптимизируется в прямой вызов (т.к. и так понятно что именно вызывается, зачем лишние разадресации?), поэтому здесь все работает. Кстати gcc выдает ворнинг pure virtual «virtual int T::pure_virtual_function()» called from constructor если вызвать pure virtual метод не выпендриваясь с вызовом через this.
P.S. Но в любом случае все это слишком сильно зависит от реализации, фазы луны и настроения компилятора. Поэтому не стоит вызывать виртуальный метод (или метод, способный его вызвать) из конструктора\деструктора. Даже если он не pure virtual, вызовется метод текущего класса или предков, но не потомка, а это скорее всего совсем не то, что хотели добиться...
LispGovno 06.03.2013 22:16 # +1
bormand 06.03.2013 23:05 # +2
По низкому уровню (сишка, асм, алгоритмы, архитектура процов) да, у меня неплохая прошаренность. А вот опыта в проектировании архитектуры масштабных проектов мне очень не хватает (т.к. по работе с ними не сталкиваюсь, а для души, естественно, такое не пишут).
Кресты, как язык, я знаю неплохо. А вот в std и boost я практически полный ноль, т.к. кресты юзал по началу как "сишку с классами", а затем совместно с кутишкой, и из std знал только контейнеры, стримы, да десяток алгоритмов. Начал восполнять этот пробел, понемногу полистывая "The C++ Standard Library: A Tutorial and Reference".
Ну и по опыту жабоебства Роман, Лур и 3.14159265 меня запросто порвут, ибо мой жабопыт состоит из пары прог под J2ME, написанных лет 8 назад, подпиливания клиента Haven&Hearth и, с недавнего времени, пары программ под ведро - одной серьезной под заказ и одной игрушечной (говнотифи, которое ты наверное видел).
defecate-plusplus 06.03.2013 23:30 # +3
а насчет буста - там немного библиотек, с нюансами которых надо знакомиться/набивать руку, обычно достаточно гугла "c++ boost whatever", чтобы за 10 минут найти исчерпывающую инфу по конкретной проблеме, либо понять, что в бусте-то этого нет
опыт набивается быстро, если есть интересный и не очень тривиальный проект - challenge
надо лишь менять место дислокации в более крупный город с бОльшими возможностями, а работу в нем ты найдешь без труда
кстати, удивлен ценами на квартиры в киеве - дешевле, чем даже в новосибирске
LispGovno 07.03.2013 15:13 # 0
> а насчет буста - там немного библиотек
Вижу, что провоцируется крестосрач
bormand 07.03.2013 15:22 # 0
Не вырываем из контекста, мистер Трололо.
defecate-plusplus 07.03.2013 15:23 # +4
там материала на методичку:
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
в бусте же зачастую утилитарные строительные блоки, далеко не каждая первая там библиотека - фреймворк в себе, требующий навыка с ним, памяти о заботливо расставленных граблях
и да, я не хочу сказать, что я пользовался всеми библиотеками из буста, но большинство из тех, чем пользовался - просты в употреблении с первой ложки
roman-kashitsyn 07.03.2013 14:09 # +4
Не надейся, никто не поведётся.
А поработать с бормандом в одной команде я бы не отказался.
roman-kashitsyn 07.03.2013 14:25 # +2
Yuuri 07.03.2013 14:43 # 0
absolut 07.03.2013 15:43 # 0
К @bormand'у?
Yuuri 07.03.2013 17:50 # 0
3.14159265 07.03.2013 17:52 # +4
Тут помогут с работой
А HaskellGovno возьмете?
LispGovno 07.03.2013 23:25 # −1
А почему тебя это интересует? Не отвечай сразу. Пускай аноны выдвинут несколько теорий. Я их развею, а ты подтвердишь.
bormand 07.03.2013 14:33 # +3
ЛиспГовно открыл мне глаза... Раньше я не понимал этого, и считал себя обычным человеком... Но теперь я осознал, что я - Великий и Всемогущий Борманд, представитель расы Избранных, затмевающий облака и солнце подошвами своих сапог. А вы все ничтожные и глупые муравьи, которых я уничтожу вместе с вашей никому не нужной планетёнкой. [зловещий смех]Му-ха-ха-ха...[/зловеший смех]
roman-kashitsyn 07.03.2013 14:38 # +2
Только вот Нижний по сравнению с СПБ - большая деревня, а цены на новое жильё как в Москве. Погода, правда, в среднем лучше.
bormand 07.03.2013 14:52 # 0
Спасибо, добавлю НН в список потенциальных городов.
defecate-plusplus 07.03.2013 14:55 # +1
я бы вот не отказался, если бы в москве такие цены были, например
Yuuri 07.03.2013 17:52 # 0
roman-kashitsyn 07.03.2013 21:30 # 0
LispGovno 07.03.2013 14:55 # +2
LispGovno 07.03.2013 15:04 # 0
Та и у меня не намного больше (лишь в 2 раза). Хотя я лишь крестушок. Если скажу, что немного знаю Haskell то меня просто закрестушат.
bormand 07.03.2013 15:05 # +2
defecate-plusplus 07.03.2013 15:05 # +2
скажи, чтобы я туда не вздумал поехать
roman-kashitsyn 07.03.2013 15:36 # +1
LispGovno 07.03.2013 15:07 # +1
LispGovno 07.03.2013 15:10 # −1
bormand 07.03.2013 22:35 # +1
Фундаментальное по алгоритмам/структурам данных - читал лет 10 назад Кнута и Вирта, не читал, но слышал хорошие отзывы о книгах Ахо и Кормена.
Насчет многопоточности - хорошая книга Java concurrency in practice. Она хоть и жабья, но многие принципы, описанные там, вполне универсальны.
По крестам могу предложить интересную книжку с уклоном в практику - Imperfect C++.
LispGovno 07.03.2013 23:19 # 0
bormand 06.03.2013 18:37 # +2
Прога, скомпиленная gcc, в такой ситуации вызывает __cxa_pure_virtual которая сразу же делает аборт. В вижуалке, если я правильно понимаю доку (не тестил), можно засунуть свой обработчик при помощи _set_purecall_handler, но по дефолту тоже аборт.
Bart 06.03.2013 14:02 # +3
Но плюсую: это хардкор даже в качестве дебаг-инструмента.
3.14159265 06.03.2013 14:41 # +3
>abstract method
Похоже на то.
Ccik 06.03.2013 16:36 # 0
LispGovno 06.03.2013 14:59 # +4
Ccik 06.03.2013 16:36 # +2
LispGovno 06.03.2013 22:17 # +3