我想跟踪某些选定类的对象的删除,而类代码本身的更改很少。
我考虑过重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;
}
};
我有两个问题。
这是虚拟继承的良好用法,并且使用virtual关键字将最后一个叶子留在继承树中是正确的(参见anysubsubclass
定义,它没有派生类),与{{3相反}}?关键是我想尽可能少地打扰我是否要在anysubsubclass
中添加未来的后验派生类,或者删除基数和基数之间的anysubclass
。最后派生的课程。
二。正如您在我的代码中看到的,如果其中一个目标类具有operator=
的重载,或者具有复制构造函数,那么operator=
或track_death
的复制构造函数永远不会得到调用,这是一个问题,因为track_death
包含一个无法用其简单的复制构造函数复制的字段。我的解决方案,告诉any*class
的实现者,他必须使用被复制的对象调用copy_info()
看起来容易出错。有更好的解决方案吗?