У меня есть класс под названием Widget
. Этот класс является абстрактным и имеет виртуальные методы. Чтобы избежать обрезки объектов, все Widgets
хранятся в виде ссылок или указателей. У меня есть несколько классов с конструкторами, которые хранят внутренне виджет, предоставленный им; таким образом, хранящийся файл Widget
должен быть инициализирован вне конструктора и не может быть уничтожен до объекта, поэтому обычно Widget
выделяется через динамическую память. Мой вопрос касается того, как обращаться с этой динамической памятью; Я составил список опций (не стесняйтесь предлагать другие). Какой из них самый идиоматический?Программный дизайн, связанный с полиморфизмом и управлением ресурсами
1. Умные указатели. Умные указатели кажутся правильным выбором, но поскольку я использую C++ 98, я должен написать свой собственный. Я также считаю, что письмо smart_pointer<Widget>
все время немного уродливое.
2. Копия Widgets
при хранении. Другим направлением является копия переданного Widget
вместо оригинала. Это может вызвать обрезку объектов, но я не уверен. Кроме того, пользователи могут сами писать классы, которые хранят переданные в Widgets
, и я бы не хотел, чтобы это было слишком сложно.
3. Позвольте пользователю обрабатывать все. Я мог бы заставить пользователя убедиться, что Widget
удален вовремя. Кажется, это то, что Qt делает (?). Однако это снова усложняет ситуацию для пользователя.
Я использовал бы умные указатели. Существует 'std :: auto_ptr', хотя он ошибочен. Если 'std :: auto_ptr' не выполняет задание, напишите одно или найдите уже написанное. – Galik
И вы можете делать такие вещи, как 'typedef unique_pointer WidgetUPtr;' чтобы сделать ввод менее подробным. –
Galik
Кроме того, другим вариантом будет идиома 'clone'. https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Constructor. Вы можете использовать его со своей * опцией 2 *, чтобы избежать нарезки объектов. –