Pull to refresh
120
0
Сергій Олендаренко @GooRoo

User

Send message
Jim Coplien значится в рецензентах и «благодарностях» к многим книгам других известных авторов, даже у Страуструпа по-моему… Так что, возможно, Вы его уже читали :)
О киндзюцу тоже надо иметь представление ;)
Я не против, ибо в принципе я и не приписывал такой подход к паттернам.
Если есть шанс того, что Вы будете вносить подобные изменения, их нужно предусмотреть на этапе проектирования, а значит — подобный «мегахак» не для Вас.
Это я конкретно про текущую реализацию.
Можно, к примеру, сделать лексический анализатор, который будет использовать виртуальный конструктор для создания определенного вида лексем на основе какой-то входной инфы…
Да, примерно это я и подразумевал под «порефакторить» ;)
Немного нужно порефакторить, но в целом вот: dumpz.org/10589/
«…чтобы обеспечить заявленную логику, базовый класс ДОЛЖЕН знать о всех потомках, которые будут от него унаследованы когда-нибудь».

Это плата за то чтобы клиент базового класса о потомках даже не подозревал.
Во-первых, это не накуралесил, а Coplien.

А во-вторых, я не заставляю Вас пользоваться описанной методикой. Если она Вам не подходит, то это еще не означает, что она бесполезна. У всех паттернов есть свои достоинства и недостатки.
Моё дело познакомить Вас с такой возможностью, а использовать её или нет — решать Вам.

Кстати, «письмо и конверт» — это, можно сказать, особый вид паттерна State.
o_O

Графика, конечно, не как в .kkrieger, но и места занимает в полторы тысячи раз меньше. Респект.
Неопределенное поведение не намного лучше утечки памяти (а может и хуже).
Просто не нужно рассчитывать на виртуальный вызов метода из деструктора.
Хотя, возможно, я не прав. Я кажется понял, о чем Вы.
Не нахожу. Именно за счет этого, С++ гибкий и мощный язык, хоть и сложный.

В случае
class A {};
class B: public A {
char m_str[1000];
}

int main() {
A * pA = new B;
delete pA;
return EXIT_SUCCESS;
}

утечка, полагаю, все-таки произойдет, потому деструктор класса B вызван не будет. А если он не будет вызван, то кто должен освобождать память, занятую данными объекта B?
Если вам непонятно, могу добавить какую-нибудь левую виртуальную функцию в базовый класс. Я сделал виртуальный деструктор для того чтобы объяснить, как пойдут дела в таком случае.

А правило такое потому, что если в базовом классе нет виртуальных функций, то вряд ли есть особый смысл обращаться к производным классам через указатель на базовый, и наоборот — если в базовом виртуальные функции есть, то практически наверняка вы будете обращаться к нему и его потомкам через указатель.
Если что-то можно не писать, то лучше это все-таки написать, за исключением случаев, когда эта особенность настолько известна, что её знают все как дважды два.

Information

Rating
Does not participate
Location
Украина
Registered
Activity