通过C++中的删除方法自行删除对象

Self deletion of object through remove method in C++

本文关键字:删除 对象 方法 通过 C++      更新时间:2023-10-16

如何改进代码的架构?我觉得通过调用其void remove() { delete this; }方法删除对象的想法有问题。


我的程序中有对象的层次结构(我称之为层次结构 1(。层次结构中的每个对象都可以包含其他类的一个或多个对象。例:

class A { std::vector<std::unique_ptr<B>> bs; };
class B { std::unique_ptr<C> c; };
class C { std::unique_ptr<D> d; std::vector<std::unique_ptr<E>> es; };
class D {};
class E {};

我也有正交层次结构(我称之为层次结构2(。它是对象的层次结构,它不包含任何数据,而是表现为一些基本对象与数据的表示。此层次结构中的对象之间的连接是通过信号/插槽模式建立的。例:

class C { 
std::unique_ptr<D> d; std::vector<std::unique_ptr<E>> es;
Signal changed;
void change(); // somehow changes data and emits signal changed
};
class D { 
Signal changed;
void change(); // somehow changes data and emits signal changed
}; 
class C1 { 
C1(C* c) { c->changed.connect(this, &C1::change); }; 
Signal changed;
void change(); // updates its local state based on changes in class C and emits own "changed" signal
}
class C1D {
C1D(C1* c1, D* d) {
c1->changed.connect(this, &C1D::change);
d->changed.connect(this, &C1D::change);
}; 
Signal changed;
void change(); // updates its local state based on changes in class C1 and/or D and emits own "changed" signal
}

这个层次结构运行得很好,因为我可以在任何类中启动任何修改,它首先会在层次结构 2 中下降(例如从 C1 到 C(,然后它会上升,更新所有表示(依赖于 C(。

当我开始考虑删除对象时,对架构正确性的唯一疑问就出现了。我想做与修改基本相同的操作,因此我引入功能和信号对"删除",而不是功能和信号对"更改"。所以这个想法是,当我调用例如c1->remove()它应该将删除请求传递到 C 类时,此时类 C 将启动信号强制删除其每个表示(C1、C1D(,最后类 C 将要求其父 B 重置std::unique_ptr<C> c;从而导致自我毁灭。

如何改进此体系结构?我相信当我有指向对象C* c = ...的指针时,调用c->remove(),对象实际上被销毁并且无法使用指针时,这不是常见的模式。

如何改进此体系结构?我相信当我有指向对象 C* c = ...,调用 c->remove(( 时,这不是常见的模式,对象实际上被销毁并且无法使用指针。

该对象一直存在,直到析构函数返回,因此析构函数中仍然可以使用它。以下情况是完全合法的:

class C 
{
Signal destroyed (C *);
~C() 
{
destroyed (this);
}
}

Qt做到了(它有一个destroy((信号(,我用这种方式编写了自我更新的树结构。

不过,有两点评论:

  • 当 C++ 有一个完全合法的方式来通过删除运算符销毁对象时,为什么要创建一个 remove(( 函数?
  • 如果你必须有一个函数,我建议称它为 destroy(( 而不是 remove((; 后者建议从列表等中删除而不实际销毁。