C++中建立对象间消息连接的一种系统方法

该博客主要围绕C++中回调列表的操作展开。包含回调列表的内存分配、复制、删除等操作,如在内存分配出错时输出错误信息并退出程序;还涉及添加、删除回调函数,以及根据事件调用回调函数等功能,同时处理了事件名为空等特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



cerr<<"CallBack: memory allocation error."<<endl;

exit(1);

}

//一一复制各条事件记录

for(int i = 0; i < size; i++) callBackList[i] = cb.callBackList[i];

}

CallBack::~CallBack(void)

{

delete [] callBackList;

}

void CallBack::AddCallBack(char *event, CallBackFunction pCBF, CallBack *pCBO)

{

//如事件名为空,退出

if( (event == NULL)?1:(strlen(event) == 0)) return;

//寻找因删除事件记录而产生的第一个空闲位置,并填写新事件记录

for(int start=0;start<lastpos;start++)

if(callBackList[start].IsEmpty()){

callBackList[start] = EventRecord(event,pCBO,pCBF);

break;

}

if(start < lastpos) return; //确实存在空闲位置

//没有空闲位置,在回调表后追加新记录 if(lastpos == size) //回调表已满,需“伸长”

{

EventRecord *tempList = callBackList;//暂存旧回调表指针

//以一定的步长“伸长”回调表

callBackList = new EventRecord[size + CALLBACKLIST_INCREMENT];

if(!callBackList){

cerr<<"CallBack: memory allocation error."<<endl;

exit(1);

}

//复制旧回调表中的记录

for(int i = 0; i < size; i++) callBackList[i] = tempList[i];

delete [] tempList;//删除旧回调表

size += CALLBACKLIST_INCREMENT;//记下新回调表的尺寸

}

//构造新的事件记录并将其填入回调表中

callBackList[lastpos] = EventRecord(event,pCBO,pCBF);

lastpos++;

}

void CallBack::AddCallBack(char *event,CallBackStaticFunction pCBSF)

{

if( (event == NULL)?1:(strlen(event) == 0)) return;

for(int start=0;start<lastpos;start++)

if(callBackList[start].IsEmpty()){

callBackList[start] = EventRecord(event,pCBSF);

break;

}

if(start < lastpos) return; //a hole is found

if(lastpos == size) //event list is insufficient

{

EventRecord *tempList = callBackList;

callBackList = new EventRecord[size + CALLBACKLIST_INCREMENT];


if(!callBackList){

cerr<<"CallBack: memory allocation error."<<endl;

exit(1);

}

for(int i = 0; i < size; i++) callBackList[i] = tempList[i];

delete [] tempList;

size += CALLBACKLIST_INCREMENT;

}


callBackList[lastpos] = EventRecord(event,pCBSF);

lastpos++;

}


//删除注册在指定事件上的成员函数

void CallBack::RemoveCallBack(char *event, CallBackFunction pCBF, CallBack *pCBO)

{

if( (event == NULL)?1:(strlen(event) == 0)) return;

EventRecord er(event,pCBO,pCBF);


for(int i = 0; i < lastpos; i++)

if(callBackList[i] == er) callBackList[i].Flush();

}


//删除注册在指定事件上的静态成员函数或普通函数

void CallBack::RemoveCallBack(char *event,CallBackStaticFunction pCBSF)

{

if( (event == NULL)?1:(strlen(event) == 0)) return;

EventRecord er(event,pCBSF);


for(int i = 0; i < lastpos; i++)

if(callBackList[i] == er) callBackList[i].Flush();

}

//删除注册在指定事件上的所有回调函数

void CallBack::RemoveCallBack(char *event)

{

if( (event == NULL)?1:(strlen(event) == 0)) return;

for(int i = 0; i < lastpos; i++)

if(callBackList[i] == event) callBackList[i].Flush();

}


void CallBack::CallCallBack(char *event, CallData callData)

{

if( (event == NULL)?1:(strlen(event) == 0)) return;


CallBack *pCBO;

CallBackFunction pCBF;

CallBackStaticFunction pCBSF;


MoveFirst();

while(!EndOfList())

{

//如当前事件记录和指定事件不匹配,转入下一条记录继续循环

if(!(callBackList[curpos] == event))

{

MoveNext();

continue;

}

//如找到匹配记录

pCBO = callBackList[curpos].pointerToCBO;

//如事件记录中回调对象指针为空,说明该记录中保存的是静态函数指针

if(pCBO == NULL){

pCBSF = callBackList[curpos].pointerToCBSF;

pCBSF(callData);//调用该静态回调函数

}

else //如事件记录中回调对象指针非空,说明该记录中保存的是成员函数指针

{

pCBF = callBackList[curpos].pointerToCBF;

(pCBO->*pCBF)(callData);// 调用该回调对象的成员函数

}

MoveNext();

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值