通过C++中的删除方法自行删除对象
Self deletion of object through remove method in C++
如何改进代码的架构?我觉得通过调用其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((; 后者建议从列表等中删除而不实际销毁。
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象