我有一个对象 ,BagOfThings
它存储一组Thing
s 和一个 s 列表BagOfThingsListener
,它们想知道何时Thing
添加或删除了BagOfThings
它们已添加到的对象。像这样:
class Thing;
class BagOfThings;
class BagOfThingsListener {
public:
virtual ~BagOfThingsListener() {}
virtual void thingAdded(std::shared_ptr<BagOfThings> bag, std::shared_ptr<Thing> thing)=0;
virtual void thingRemoved(std::shared_ptr<BagOfThings> bag, std::shared_ptr<Thing> thing)=0;
};
class BagOfThings: public enable_shared_from_this<BagOfThings> {
private:
std::set<std::shared_ptr<Thing>> things;
std::list<std::shared_ptr<BagOfThingsListener>> listeners;
private:
BagOfThings() {}
public:
static std::shared_ptr<BagOfThings> create() {
return std::shared_ptr<BagOfThings>(new BagOfThings());
}
void addThing(std::shared_ptr<Thing> thing) {
things.insert(thing);
for (auto it=begin(listeners); it!=end(listeners); ++it) {
(*it)->thingAdded(shared_from_this(), thing);
}
}
void removeThing(std::shared_ptr<Thing> thing) {
things.erase(thing);
for (auto it=begin(listeners); it!=end(listeners); ++it) {
(*it)->thingRemoved(shared_from_this(), thing);
}
}
~BagOfThings() {
for (auto it=begin(things); it!=end(things);) {
auto currentIt=it++;
auto ¤tThing=*currentIt;
things.erase(currentIt);
for (auto it2=begin(listeners); it2!=end(listeners); ++it2) {
(*it2)->thingRemoved(shared_from_this(), currentThing);
}
}
}
};
shared_from_this()
这工作正常,除了析构函数,它是无效的,因为当所有shared_ptr
s 都被销毁时,你不能使用,它们在调用析构函数时已经被销毁。在这种情况下,我使用的是共享指针,但在我看来,从析构函数中分发 this 指针无论如何都是有问题的——例如,有人可能会存储指针。thingAdded
但是在这种情况下(希望让听众知道销毁所有元素的删除),如果不从听众中删除指向调用者的指针(即会变成) ,我看不到明显的好方法void thingAdded(std::shared_ptr<Thing>)
。
有任何想法吗?