C++ 如何在销毁*成员后在析构函数*中执行某些代码

C++ 如何在销毁*成员后在析构函数*中执行某些代码,c++,c++11,c++14,C++,C++11,C++14,我有一个“经理”类,必须在成员被销毁后进行清理: class Manager { Member a, b; ~Manager() { // this code will be executed BEFORE the a and b destructors important_cleanup(); } }; 这里的问题是important\u cleanup()使我的变量a和b无效,因此它们的析构函数失败 有解决这个问题的好办法吗

我有一个“经理”类,必须在成员被销毁后进行清理:

class Manager
{
    Member a, b;

    ~Manager()
    {
        // this code will be executed BEFORE the a and b destructors
        important_cleanup();
    }
};
这里的问题是
important\u cleanup()
使我的变量
a
b
无效,因此它们的析构函数失败

有解决这个问题的好办法吗


PS我知道我可以定义某种类型的clenup成员,并使其成为
管理器的第一个创建成员,但这看起来很难看,使事情依赖于顺序…

依赖销毁顺序确实不容易出错,假设您还添加了一条注释,说明成员顺序对特定成员很重要。它被放在语言中是有原因的,所以使用它是完全正确的

也就是说,如果您不喜欢依赖它,那么可以使用基类来实现这一点:

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;
};

这绝对是一个糟糕的设计……为什么一个无效的
成员
对象不能被销毁?这毫无意义,依我看,这项决定背后的原因是什么?@CoryKramer,或某项政策的错误执行。“使成员无效,使析构函数失效”?
重要吗\u cleanup()?通过这种方式,
important\u cleanup()
可以通过将
a
b
替换为
nullptr
s来确保它们的销毁。对了,我比cleanup成员更喜欢这些,谢谢!嗯,我不喜欢第二个变体,因为它似乎很容易出错,这就是我在文本中写的。@Dimaleks是的,你是对的。你的问题表明你正在寻找替代方案。更新以反映这一点