psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2009-07-14 04:31 pm

Западло

[ Предупреждение: для непрограммистов неинтересно ]

Пусть у нас есть два класса - базовый Base и отнаследованный от него Derived. В Derived есть конструктор, похожий на конструктор копии с параметром типа Base.

class Base
{
...
};

class Derived: public Base
{
public:
    Derived() {...}
    Derived(const Base &b) { /* важные манипуляции */ }
};


Допустим, в программе это используется вот так:

Derived d1;
Derived d2(d1);


И оно не работает.

Тщательное расследование показало эпическое западло...



В какой-то момент я внес часть кода в функцию:

void foo(Base &d1)
{
    Derived d2(d1);
    ...
}
...
Derived d1;
foo(d1);



И вдруг оно начало работать! Счастливый, я все так и оставил, предполагая разобраться как-нибудь потом. Сегодня это как-нибудь наступило.

Западло состоит в том, что в строке Derived d2(d1) не всегда вызывается второй конструктор и не будут выполняться "важные манипуляции". Вместо этого будет вызван "невидимый" автоматически сгенерированный конструктор-копии, и все поля будут тупо скопированы из d1 в d2.

Это происходит в том случае, если d1 имеет тип Derived. Если Base - то все хорошо. Вот почему та функция исправляла проблему. Так тоже будет работать:

Derived d2((Base&)d1);


Лечится это легко:

class Base
{
...
};

class Derived: public Base
{
public:
    Derived() {...}
    Derived(const Base &b) { /* важные манипуляции */ }
    Derived(const Derived &b) { /* важные манипуляции */ }
};


Но ведь и вляпаться тоже легко...

[identity profile] bsivko.livejournal.com 2009-07-19 10:46 am (UTC)(link)
Опять ругаться начал. Нервы уже не те, да?

>Речь шла о числовых константах, у тебя склероз что ле?

Нет, я работаю с первоисточником. У Мейерса нет ни слова про числовые константы, их похоже выдумал ты.

В любом случае если имеются какие-либо действия по конструированию элемента, они произойдут при использовании define. При const этого нет.

Придумай себе класс числовых значений (например комплексных/рациональных или ещё каких чисел) и получишь соответствующий результат.

>Америку, блядь, открыл...

Для тебя похоже что открыл. Т.к. ты рассуждаешь тут теоретически, а на самом деле во многом все зависит и от компилятора, и от харда. И "в среднем" специалисты говорят, что const позволяет работать быстрее и использовать меньше памяти.

Так что не строй из себя идиота.

Неудобные вопросы ты успешно проигнорил. Недостаток квалификации в предмете и дискуссии "компенсируется" квалификацией в полемике.

>Для компилятора нет define, препроцессор уже подставил вместо имени define число. А одно и то же число - это сущность неизменяемая. Короче, не строй из себя идиота

Это число ещё нужно найти и сопоставить его в различных кусках кода. Может ещё скажешь в каждом "for( int i =0; ..." компилятор где-то 0 хранит как одинаковое число? Фигвам.

[identity profile] psilogic.livejournal.com 2009-07-19 10:58 am (UTC)(link)
[ Нет, я работаю с первоисточником. У Мейерса нет ни слова про числовые константы, их похоже выдумал ты. ]

Я ссылался на первоисточник, на страницы 29-30. Страница 29, читаем:

const double CostEstimate::FudgeFactor = 1.35;

Это не числовая константа?

Мое терпение иссякло. Пошел на хуй. За такое уебство я не баню, но общаться с таким говном вряд ли еще стану.

[identity profile] bsivko.livejournal.com 2009-07-19 11:49 am (UTC)(link)
Это пример, на котором разбирается рекомендация.

Всего хорошего.

P.S.
— Вас не затруднит? Будьте любезны, передайте на билетик, пожалуйста! Спасибо.
— Ну ты, хрен, из интеллигентов, что ли?
— Да нет, что вы, я такое же быдло, как и вы!
(с) Вежливо

[identity profile] psilogic.livejournal.com 2009-07-19 11:52 am (UTC)(link)
Вот поэтому Мейерс и ты с такими рекомендациями стройными рядами идете на хуй

[identity profile] bsivko.livejournal.com 2009-07-19 01:04 pm (UTC)(link)
Мирослав, все хорошо. Мейерса забрали и унесли добрые санитары. Его идеологическая деятельность тебя больше не побеспокоит.

Знал бы такую реакцию, в спор бы не вступал. Здоровье (не только мое) оно того... дороже.

Сейчас ещё раз меня пошлют на всякий случай, и все будет нормально (;