我一直在使用回调来减少一些 C++ 类之间的耦合。定义术语:我将调用进行回调的类称为调用者,并将接收回调的类称为被调用者。通常(但不一定),被调用者将拥有调用者。按照设计,调用者不知道被调用者。
我遇到了与调用者对象的生命周期有关的问题:它不能保证在进行任意回调后它仍然存在。以这个基本示例为例:
void caller::f()
{
/* Some work */
if (...)
{
/* [1] Execute callback */
_callee->callback(this);
}
/* [2] Some more work */
}
说被调用者已经动态分配了调用者,并且已经注册了回调,专门等待某个条件发生。当它这样做时,被调用者将从 [1] 处的回调中删除调用者。如果是这种情况,控制权将返回给 caller::f,但this
会被删除,并且 [2] 处的任何代码都将很可能崩溃。
在一般情况下,调用者不能假设关于被调用者的任何事情。它不知道被调用者是否拥有this
,或者它是否可能释放this
,所以我需要一些通用的方法来防止调用者的成员函数范围内的释放。
我相信一个可能的解决方案围绕boost::shared_ptrs
and enable_shared_from_this
,尽管我从未使用过它。由于这些回调在处理能力有限的移动设备上运行非常频繁(每秒 40 次以上),我还担心创建和传递这么多shared_ptrs
.
委托是 Objective-C 中非常常见的模式。我对常见的 C++ 设计模式不太熟悉。这个问题有什么快速简便的解决方法吗?如果不是,这种设计通常如何在 C++ 中完成?