我最近决定开始学习 C ++;来自脚本背景(Ruby,JavaScript,PHP)。我已经开始构建一个非常简单的观察者。我想要实现的是notify
方法的自定义回调,如下所示:
#include <iostream>
#include <functional>
using namespace std;
template<class StateT>
class Observer{
typedef function<void(StateT)> LambdaT;
LambdaT callback;
~Observer(){
//delete callback;
};
public:
void setCallback(LambdaT &callback)
{
this->callback = callback;
};
void notify(StateT state){
this->callback(state);
};
};
int main(int argc, char** argv) {
Observer<string>* obs = new Observer<string>;
std::function<void(string)> customCallback = [](string state){
cout << state << endl;
};
obs->setCallback(customCallback);
obs->notify("State has changed");
return 0;
}
然后我有一个Subject
来观察,当Subject
实例被摧毁时,所有它附加的观察者也被摧毁,以释放记忆。这只是一个想法,这可能是错误的&#34;理想&#34;实现,也不确定我是否应该如何清理内存,我还没有尝试过智能指针。
~Subject(){
for(listIterator......){
delete (*it); //observer instances pointers are stored in a list
}
};
我打算为我的观察者传递回调,作为指向setCallback()
函数的指针,所以我可以删除它,因为我从subject中删除了观察者实例。现在我的主要问题是如何解除分配已被回调占用的内存(现在是一个观察者属性)?
答案 0 :(得分:1)
你不是。回调属性不是动态分配的。您只需要确保取消分配您的观察者。根据经验,每个delete
应该有一个new
。由于您从不使用新的LambdaT,因此无需删除。
由于setCallback
方法引用了您的回调,因此此方法与main方法的值相同。但是,您不存储对回调的引用,而是存储回调的副本。所以说清楚:
customCallback
是原始值。callback
是对customCallback
。Observer::callback
是callback
。