Опора на порядок уничтожения действительно не подвержена ошибкам, при условии, что вы также добавили комментарий о том, что порядок элементов имеет значение для конкретного участника.Он введен в язык по какой-то причине, поэтому его вполне можно использовать.
Тем не менее, если вам неудобно полагаться на него, деструкторы членов вызываются раньше, чем у базовых классов, так что вы можете использовать базовый класс для этого:
class ManagerCleanup {
public:
~ManagerCleanup() {
important_cleanup();
}
private:
some_native_resource resource;
};
// Might as well inherit privately
class Manager : private ManagerCleanup
{
Member a, b;
};
Обратите внимание, что это более идиоматично, если вы оберните ресурс:
// Note: this could probably be a std::unique_ptr. std::unique_ptr can
// manage arbitrary resources, not just pointers.
class ItemRequiringCleanup {
public:
// Ensure you implement/disable copy/move operations appropriately
~ItemRequiringCleanup() {
important_cleanup();
}
private:
some_native_resource resource;
};
class ManagerCleanup {
private: // or protected:
ItemRequiringCleanup resource;
};
// Might as well inherit privately
class Manager : private ManagerCleanup
{
Member a, b;
};