首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > More Effective C++之31
【标  题】:More Effective C++之31
【关键字】:More,Effective,C++
【来  源】:http://blog.csdn.net/hanyu1980/archive/2006/07/24/970708.aspx

More Effective C++之31

条款31:让函数根据一个以上的对象型别来决定如何虚化

       如果函数有两个自变量,而这两个自变量都是继承类,我们如果根据排列组合的办法来实现继承类。RTTI或者只使用虚函数?似乎都不是好办法。Meyers给出的解决方案是自行仿真虚函数表格(Virtual Function Tables

考虑如下代码:
#include <string>
#include <algorithm>
#include <iostream>
#include <map>
#include <typeinfo>
usingnamespacestd;
classGameObject
{
public:
       GameObject(){}
       virtual ~GameObject(){}
protected:
private:
};
 
classSpaceShip:publicGameObject
{
public:
       SpaceShip(){};
       virtual ~SpaceShip(){}
protected:
private:
       inti;
};
 
classStation:publicGameObject
{
public:
       Station(){}
       virtual ~Station(){}
};
 
classAsteriod:publicGameObject
{
public:
       Asteriod(){}
       virtual ~Asteriod(){}
};
voidshipAsteriod(GameObject& spaceShip,GameObject& asteriod)
{
       printf("shipAsteriod\n");
}
 
voidshipStation(GameObject& spaceShip,GameObject& station)
{
       printf("shipStation\n");
}
 
voidasteriodStation(GameObject& asteriod,GameObject& station)
{
       printf("asteriodStation\n");
}
 
voidasteriodShip(GameObject& asteriod,GameObject& spaceShip)
{
       shipAsteriod(spaceShip,asteriod);
}
 
voidstationShip(GameObject& station,GameObject& spaceShip)
{
       shipStation(station,spaceShip);
}
 
voidstationAsteriod(GameObject& station,GameObject& asteriod)
{
       asteriodStation(asteriod,station);
}
 
typedefvoid (*HitFunctionPtr)(GameObject&,GameObject&);
typedefmap<pair<string,string> ,HitFunctionPtr> HitMap;
HitMap* initializeCollisionMap();
HitFunctionPtrlookup(conststring& class1,conststring& class2);
 
pair<string,string> makeStringPair(constchar* s1,constchar* s2);
 
voidprocessCollision(GameObject& obj1,GameObject& obj2)
{
       HitFunctionPtrphf = lookup(typeid(obj1).name(),typeid(obj2).name());
       if (phf)
       {
              phf(obj1,obj2);
       }
       else
              throwexception();
}
 
 
pair<string,string> makeStringPair(constchar* s1,constchar* s2)
{
       returnpair<string,string>(s1,s2);
}
 
HitMap* initializeCollisionMap()
{
       HitMap *phm = newHitMap;

       (*phm)[makeStringPair(typeid(SpaceShip).name(),typeid(Asteriod).name())] = &shipAsteriod;

       (*phm)[makeStringPair(typeid(SpaceShip).name(),typeid(Station).name())] = &shipStation;

       (*phm)[makeStringPair(typeid(Station).name(),typeid(Asteriod).name())] = &stationAsteriod;

       (*phm)[makeStringPair(typeid(Station).name(),typeid(SpaceShip).name())] = &stationShip;

       (*phm)[makeStringPair(typeid(Asteriod).name(),typeid(SpaceShip).name())] = &asteriodShip;

       (*phm)[makeStringPair(typeid(Asteriod).name(),typeid(Station).name())] = &asteriodStation;

       returnphm;
}
 
 
HitFunctionPtrlookup(conststring& class1,conststring& class2)
{
       staticauto_ptr<HitMap> collisionMap(initializeCollisionMap());
       HitMap::iteratoriter = collisionMap->find(makeStringPair(class1.c_str(),class2.c_str()));
       if (iter == collisionMap->end())
              return 0;
       returniter->second;
}
 
intmain(intargc, char* argv[])
{
       SpaceShipship;
       Asteriodast;
       Stations;
       processCollision(ship,ast);
       processCollision(ast,ship);
       processCollision(s,ship);
       processCollision(ship,s);
       processCollision(ast,s);
       processCollision(s,ast);
       return 0;
}
 

这是一个用RTTI来实现的Virtual Function Table的仿真,那么在这个Function Table中,只需要加入合适的函数指针到map中去就可以了。千万注意的是,如果想支持RTTI,并须有虚函数存在才可以,否则……。我开始就犯了这个错误。

 
原滋原味的C界面程序:【上一篇】
电话费也该用完:【下一篇】
【相关文章】
  • More Effective C++后记及目录
  • C++基础库javen 0.1 for win版发布
  • 读VC++内幕之体悟 - 08
  • JNI之C++调用Java类——java.lang.String
  • 在Visual C++中用ADO进行数据库编程
  • C++学习日志一
  • C++学习日志二
  • C++面试题集(最全的C\C++试题集和部分答案)
  • C++学习日志三
  • c++学习笔记(四)——类(2)
  • 【随机文章】
  • 用JAVA写的留言板原代码
  • Java基础面试题系列三(线程篇)
  • 看网中人十三问有感
  • 将C++语言源码转成html文件
  • Maya Mental Ray 的Final Gathering(1)
  • [收藏]C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
  • require()和include()的区别
  • 对数据库中的数据的操作
  • Emacs常用命令速查(转载)
  • CWDM:光通信技术的新亮点
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.