• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

利用C++ 虚函数实现类之间的通信

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 20次 | 进入软件测试论坛讨论

领测软件测试网

类之间的通信方法有很多种,在这里着重介绍利用虚函数的方法。希望对大家有帮助。

1 问题回顾:设数据处理类CData ,外界类CProcessGUI , 因为CData 不知道调用者类的类型(类型为CProcessGUI),只能利用调用者类的回调函数来处理问题。 现在利用虚函数来改进这一问题的处理过程,使得CData 可灵活处理调用者类的各种操作。

2 处理难点: CData类得到了调用者类的指针(LPVOID)Lparam , 却因为无法得知调用者类的类型,而无法进行转换。常规的知道调用者的类型会做如下转换:
CProcessGUI *PT = (CProcessGUI *)Lpararm;
PT->Function(...) //利用PT 进行各种操作了。
3 解决方法 :将要操作调用者类的函数在抽象类中写成接口 。
Class BaseGUI
{
Virtual void ShowWindow(Bool b )= 0; // 显示界面
Virtual void ProcessDataShow(int Idata) = 0; // 在界面中处理数据
..... // 各种你想要的操作
}

Class ProcessGUI :public BaseGUI
{
virtual void ShowWindow(Bool b)
{
if(b)
{
this->ShowWindow(SW_HIDE);
}
else
{
this->ShowWindow(SW_SHOW);
}
}

virtual void ProcessDataShow(int Idata)
{
for(int i = 0 ;i {
cout<< " i = "< }
......... // 各种其他接口的处理
}
Class CData
{
BaseGUI * m_BaseGui ;
void GetGUI(BaseGUI *pB)
{
m_BaseGui = pB;
}
void Run ()
{
...... // 各种处理
if(...)
m_BaseGui->ShowWindow(true);
else
m_BaseGui->ShowWindow(false);
m_BaseGui->ProcessDataShow(x); // X为所要通知给界面类的真正数据
}
}
4 使用方法
void main(void )
{
ProcessGUI A;
CData B;
B.GetGUI(&A); // 此时 m_BaseGui 就指向了A对象;
B.Run(); // B 并没有关心A对象是何类型 ,但却利用A对象的指针作了B想要控制的事情 ;

} 5 扩展 CData 作为 多个外界类 的服务。
同理让多个外界类继承BaseGUI类 。
在CData中 加入
Class CData
{
vector m_vBaseGui ;
void push(BaseGUI *pB)
{
m_vBaseGui.push_back(pB);
}
void Run ()
{
...... // 各种处理
if(...)
{
for(int i = 0 ;i m_vBaseGui[i]->ShowWindow(true);
}
else
{
for(int i = 0 ;i m_vBaseGui->ShowWindow(false);
}

for(int i = 0 ;i m_vBaseGui->ProcessDataShow(x); // X为所要通知给界面类的真正数据
}
}

void main(void)
{
ProcessGUI1 A;
ProcessGUI2 B;
ProcessGUI3 C;

CData data;
data.push(&A);
data.push(&B);
data.push(&C);
data.Run(); // 处理了外界类的各种情况 。

}
由此可以看出,我们是利用了父类的指针调用子类的虚函数,而不关心子类类型的功能。 这也就动态晚绑定的好处。


文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网