C++中观察者模式中观察者提供接口让被观察者回调删除其自己安全吗?

思考如下情况:Observer类作为观察者,Handler类作为被观察者负责具体的任务执行,当任务执行完毕以后通知观察者完成。Observer收到调用以后删除Handler类。以下代码安全吗? 

结果:

  1. 安全。

  2. 不优雅。

  3. handler在通过调用notify接口以后还可以访问自己的资源吗?可以,但是会得到随机值。

    /* 这里是一个观察者类:开始工作时创建Handler类,并且把自己的notify函数通过this指针暴露给Handler作为回调函数使用 */ class Observer { public: void start() { int id = getId(); map_[id] = std::make_unique<Handler>(id, this); map_[id]->start(); } void notify(int id) { auto it = map_.find(id); if (it != map_.end()) { printf("erase task=%d\n", id); map_.erase(it); } } private: int id_ { 0 }; std::map<int, std::unique_ptr<Handler>> map_; };

    /* 这里是Handler类:完成工作以后通过Observer的指针直接调用notify函数 / class Handler { public: Handler(int id, Observer observer): id_(id), observer_(observer){} void start() { observer_->notify(id_); } private: int id_; Observer* observer_; };

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593