gpt4 book ai didi

c++ - C++中通过remove方法自删除对象

转载 作者:行者123 更新时间:2023-11-28 01:32:57 28 4
gpt4 key购买 nike

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


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

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

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

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;因此导致 self 毁灭。

我该如何改进这个架构?我相信当我有指向对象的指针时这不是常见的模式 C* c = ... , 调用 c->remove() ,对象实际上被销毁了,指针不能使用了。

最佳答案

How can I improve this architecture? I believe it is not common pattern when I have pointer to object C* c = ..., call c->remove(), object is actually destroyed and pointer can't be used.

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

class C 
{
Signal destroyed (C *);

~C()
{
destroyed (this);
}
}

Qt 做到了(它有一个 destroyed() 信号)并且我已经用这种方式编写了自更新树结构。

不过有两条评论:

  • 为什么要创建 remove() 函数,因为 C++ 有一种完全合法的方法可以通过删除运算符销毁对象?
  • 如果您必须有一个函数,我建议将其称为 destroy() 而不是 remove();后者建议在没有实际破坏的情况下从列表等中删除。

关于c++ - C++中通过remove方法自删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50777913/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com