我想跟踪一些选定类的对象的删除,类代码本身的变化很小。
我考虑过重载delete
运算符(全局),但它要求我的重载delete
存在于所有编译单元中,在我的情况下这可能很麻烦。此外,如果创建了跟踪对象的数组,我将不得不重载delete[]
运算符,但不幸的是,在该重载代码中没有标准方法可以知道数组的长度以及正在销毁的对象数量。我也可以重载new[]
运算符并跟踪分配及其长度,但它看起来不是一个干净的解决方案,并且遇到delete[]
运算符的相同问题,即它必须在每个编译单元中都可以访问。
所以我接受了对目标类的轻微修改。我的想法是在目标类中“注入”监视类的析构函数,并带有“虚拟”(可能是多个)继承。当然,目标类可能是另一个的一个孩子,所以它看起来像是虚拟继承的工作。这是我到目前为止提出的。
class track_death{
protected:
struct someusefulness{} info;
track_death(){}
explicit track_death(const track_death& o){
copy_info(o);
}
track_death& operator=(const track_death& o){
copy_info(o);
return *this;
}
void copy_info(const track_death& o){
//manage the copy of info, which is not trivial.
}
~track_death(){
//death has happened!
}
};
struct anyclass: virtual track_death{
//wathever 1...
};
struct anysubclass: public anyclass, virtual track_death{
//wathever 2...
anysubclass(){}
anysubclass(const anysubclass& copythis){
//initialization...
//the user MUST append this last
copy_info(copythis);
}
};
struct anysubsubclass: public anysubclass, virtual track_death{
//wathever 3...
anysubsubclass& operator=(const anysubsubclass& copythis){
//initialization...
//the user MUST append this last
copy_info(copythis);
return *this;
}
};
我有两个问题。
这是对虚拟继承的一种很好的用法吗?与这个 parashift 建议anysubsubclass
相反,使用 virtual 关键字(参见定义,它没有派生类)离开继承树中的最后一片叶子是否正确?关键是我想尽可能少地打扰我是否要在未来添加或删除,例如,在基类和最后一个派生类之间。anysubsubclass
anysubclass
第二。正如您在我的代码中看到的,如果其中一个目标类具有 或 的重载operator=
,或者具有复制构造函数,则永远不会调用operator=
或 的复制构造函数track_death
,这是一个问题,因为track_death
包含无法复制的字段使用其简单的复制构造函数。我的解决方案是告诉实现者any*class
他必须调用copy_info()
被复制的对象,这看起来很容易出错。有更好的解决方案吗?