C++ 委托怎么样带参数

C++语言 码拜 7年前 (2017-05-07) 1517次浏览
class Event
{
public:
Event()
{
}
Event& operator+=(const Handler v){
add(v);
return *this;
}
Event& operator-=(const Handler v){
remove(v);
return *this;
}
vector<Handler>& GetEvent(){
return m_HandlerList;
}
protected:
virtual void add(Handler v){
m_HandlerList.push_back(v);
}
virtual void remove(const Handler v){
vector<Handler>::iterator it = m_HandlerList.begin();
for (; it != m_HandlerList.end(); it++){
if ((*it) == v){
m_HandlerList.erase(it);
break;
}
}
}
private:
vector<Handler> m_HandlerList;
};
#include “stdafx.h”
#include “Event.h”
typedef void(*EventHandler)(string str1,string str2);
class CDelegate
{
public:
CDelegate(){}
void FireEvent(string str1,string str2){
size_t nCount = AEvent.GetEvent().size();
for (size_t i = 0; i < nCount; i++){
(*(AEvent.GetEvent().at(i)))(str1,str2);
}
}
public:
Event <EventHandler,string,string> AEvent;
};
void funA(string str1,string str2){
printf(“funA is running:%s,%s\r\n”,str1,str2);
}
void funB(string str1, string str2){
printf(“funB is running:%s,%s\r\n”,str1,str2);
}
int _tmain(int argc, _TCHAR* argv[])
{
CDelegate Obj;
Obj.AEvent += funA;
Obj.AEvent += funB;
Obj.FireEvent(“test1″,”test2”);
Obj.AEvent -= funA;
Obj.FireEvent(“test1”, “test2”);
return 0;
}
printf(“funA is running:%s,%s\r\n”,str1,str2);
中报错,0x0F83FB53 (msvcr120d.dll) (MyDelegate1.exe 中)处有未经处理的异常:  0xC0000005:  读取位置 0x74736574 时发生访问冲突。
解决方案

40

改成:printf(“funA is running:%s,%s\r\n”,str1.c_str(),str2.c_str());
printf 中 %s 需要的是char*类型的字符串

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++ 委托怎么样带参数
喜欢 (0)
[1034331897@qq.com]
分享 (0)