LINUX.ORG.RU

имеется ввиду использование вместо конструкторов инициализаторов ресуров, а вот как освобождать ресурсы без деструктора, поделитесь опытом :)

anonymous
()

Существует некая незавершённость схемы конструкторов в C++, в котором из-за автоматического вызова конструкторов подобъектов (предков) сложно описать конструирование объекта как целого в одном месте, поэтому конструкторы C++ правильнее называть инициализаторами.

Таким образом, логичнее было бы иметь два шага: автоматический вызов инициализаторов предков (например, с обнулением указателей) и последующий автоматический же вызов общего конструктора. И в C++ это реализуемо! Для этого во всех классах нужно ввести инициализаторы (защищённые конструктор по умолчанию или конструкторы с фиктивным параметром) и в конструкторах потомка явно задавать именно их (чтобы подавить вызов конструкторов вместо инициализаторов предков). Если же код конструкторов выносить в отдельные [виртуальные] методы, то можно будет вызывать их в конструкторах потомков.

С деструкторами сложнее, поскольку в классе их не может быть более одного, поэтому можно ввести отдельные методы (типа shutdown и destroy). Теперь остаётся либо убрать деструкторы (хотя придётся явно вызывать методы деструкции), либо ввести общий признак, запрещающий деструкторам предков разрушать, и при переопределении метода деструкции переопределять также деструктор. И не забывайте делать их виртуальными!

anonymous
()
Ответ на: комментарий от anonymous

Фигня какая-то. По большему счету удобство с++ и заключается в конструкторах и деструкторах, и их неявных вызовах.

А так сделай структуру на Си. И сделай процедуры init и free.

anonymous
()

А ведь писали же (да хотя бы А. Голуб) - не вызывайте виртуальных методов из конструкторов и деструкторов! Ан нет - все равно хотят вызывать... А знает ли благородный дон, что во-время работы конструктора таблица виртуальных функций еще не заполнена и если происходит вызов виртуального метода то вызываться будет метод с текущего уровня наследования.  А что будет происходить при вызове виртуального метода из деструктора - так это вообще чума - возможно будет ситуация "на кого бог пошлет". В общем, как говорится - "избегайте странностей!"

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.