分享
 
 
 

more effective c++学习笔记 ---- 条款31

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

#include

#include

#include

#include

#include #include using namespace std;////class SpaceStation;//class Asteroid;//class SpaceShip;class CollisionWithUnknownObject {public: CollisionWithUnknownObject() { std::cout << "unknown error" << std::endl; } //...};class GameObject {public: virtual void collide(GameObject& otherObject) = 0; //...};//The class SpaceShip Declarationclass SpaceShip: public GameObject {public: virtual void collide(GameObject& otherObject); virtual void hitSpaceShip(GameObject& spaceShip); virtual void hitSpaceStation(GameObject& spaceStation); virtual void hitAsteroid(GameObject& asteroid); //... private: typedef void (SpaceShip::*HitFunctionPtr)(GameObject& what); static HitFunctionPtr lookup(GameObject& what); typedef map< string, HitFunctionPtr > HitMap; static HitMap* initializeCollisionMap();};//The class SpaceStation Declarationclass SpaceStation: public GameObject {public: virtual void collide(GameObject& otherObject); virtual void hitSpaceShip(GameObject& otherObject); virtual void hitSpaceStation(GameObject& otherObject); virtual void hitAsteroid(GameObject& otherobject); //...private: typedef void (SpaceStation::*HitFunctionPtr)(GameObject& what); static HitFunctionPtr lookup(GameObject& what); typedef map< string, HitFunctionPtr > HitMap; static HitMap* initializeCollisionMap();};//The class Asteroid Declarationclass Asteroid: public GameObject {public: virtual void collide(GameObject& otherObject); virtual void hitSpaceShip(GameObject& otherObject); virtual void hitSpaceStation(GameObject& otherObject); virtual void hitAsteroid(GameObject& otherobject); //...private: typedef void (Asteroid::*HitFunctionPtr)(GameObject& what); static HitFunctionPtr lookup(GameObject& what); typedef map< string, HitFunctionPtr > HitMap; static HitMap* initializeCollisionMap();};//The class SpaceShip Definitionvoid SpaceShip::collide(GameObject& otherObject){ HitFunctionPtr hfp = lookup(otherObject); //查找要调用的函数 if(hfp) { (this->*hfp)(otherObject); } else { throw CollisionWithUnknownObject(); }}SpaceShip::HitFunctionPtrSpaceShip::lookup(GameObject& what){ //不好,会有付出拷贝赋值的代价 //static HitMap collisionMap = initializeCollisioniMap(); //用一个Smart Pointer static auto_ptr collisionMap(initializeCollisionMap()); HitMap::iterator mapEntry = collisionMap->find(typeid(what).name()); // 如果查找失败,mapEntry == collisionMap.end(); if(mapEntry == collisionMap->end()) return 0; // 如果找到了,mapEntry会指向一个完全的map入口, // 它是一个(string, HitFunctionPtr)对。我们只想要 // 它的第二部分,所以这是我们返回的 return (*mapEntry).second;}SpaceShip::HitMap* SpaceShip::initializeCollisionMap(){ HitMap *phm = new HitMap; //这里书中直接就是(*phm["SpaceShip"] = &hitSpaceShip; //而我用的是Dev-C++编译器,结果我发现 // typeid(SpaceShip).name()并不仅仅是SpaceShip,而是128SpaceShip // 所以我做了如下修改 (*phm)[typeid(SpaceShip).name()] = &SpaceShip::hitSpaceShip; (*phm)[typeid(SpaceStation).name()] = &SpaceShip::hitSpaceStation; (*phm)[typeid(Asteroid).name()] = &SpaceShip::hitAsteroid; return phm;}void SpaceShip::hitSpaceShip(GameObject& spaceShip){ SpaceShip& otherShip = dynamic_cast(spaceShip); std::cout << "SpaceShip collide with SpaceShip" << std::endl;}void SpaceShip::hitSpaceStation(GameObject& spaceStation){ SpaceStation& station = dynamic_cast(spaceStation); std::cout << "SpaceShip collide with SpaceStation" << std::endl;}void SpaceShip::hitAsteroid(GameObject& asteroid){ Asteroid& theAsteroid = dynamic_cast(asteroid); std::cout << "SpaceShip collide with Asteroid" << std::endl;}//The class SpaceStation Definitionvoid SpaceStation::collide(GameObject& otherObject){ HitFunctionPtr hfp = lookup(otherObject); if(hfp) { (this->*hfp)(otherObject); } else { throw CollisionWithUnknownObject(); }}SpaceStation::HitFunctionPtr SpaceStation::lookup(GameObject& what){ static auto_ptr collisionMap(initializeCollisionMap()); HitMap::iterator mapEntry = collisionMap->find(typeid(what).name()); if(mapEntry != collisionMap->end()) return (*mapEntry).second;}SpaceStation::HitMap*SpaceStation::initializeCollisionMap(){ HitMap * pfm = new HitMap; (*pfm)[typeid(SpaceShip).name()] = &SpaceStation::hitSpaceShip; (*pfm)[typeid(SpaceStation).name()] = &SpaceStation::hitSpaceStation; (*pfm)[typeid(Asteroid).name()] = &SpaceStation::hitAsteroid; return pfm;}void SpaceStation::hitSpaceShip(GameObject& otherObject){ SpaceShip& ship = dynamic_cast (otherObject); std::cout << "SpaceStation collide with SpaceShip" << std::endl;}void SpaceStation::hitSpaceStation(GameObject& otherObject){ SpaceStation& otherSpaceStation = dynamic_cast (otherObject); std::cout << "SpaceStation collide with SpaceStation" << std::endl;}void SpaceStation::hitAsteroid(GameObject& otherObject){ Asteroid& theAsteroid = dynamic_cast (otherObject); std::cout << "SpaceStation collide with Asteroid" << std::endl;}//The class Asteroid Definitionvoid Asteroid::collide(GameObject& otherObject){ HitFunctionPtr hfp = lookup(otherObject); if(hfp) { (this->*hfp)(otherObject); } else { throw CollisionWithUnknownObject(); }}Asteroid::HitFunctionPtr Asteroid::lookup(GameObject& what){ static auto_ptr< HitMap > collisionMap(initializeCollisionMap()); HitMap::iterator mapEntry = collisionMap->find(typeid(what).name()); if(mapEntry != collisionMap->end()) return (*mapEntry).second;}Asteroid::HitMap* Asteroid::initializeCollisionMap(){ HitMap *pfm = new HitMap; (*pfm)[typeid(SpaceShip).name()] = &Asteroid::hitSpaceShip; (*pfm)[typeid(SpaceStation).name()] = &Asteroid::hitSpaceStation; (*pfm)[typeid(Asteroid).name()] = &Asteroid::hitAsteroid; return pfm;}void Asteroid::hitSpaceShip(GameObject& otherObject){ SpaceShip & ship = dynamic_cast (otherObject); std::cout << "Asteroid collide with SpaceShip" << std::endl;}void Asteroid::hitSpaceStation(GameObject& otherObject){ SpaceStation & station = dynamic_cast (otherObject); std::cout << "Asteroid collide with SpaceStation" << std::endl;}void Asteroid::hitAsteroid(GameObject& otherObject){ Asteroid & otherAsteroid = dynamic_cast (otherObject); std::cout << "Asteroid collide with Asteroid" << std::endl;}int main(){ GameObject *g = new SpaceShip; GameObject *h = new SpaceStation ; GameObject *a = new Asteroid; g->collide(*a); g->collide(*h); h->collide(*g); h->collide(*a); a->collide(*g); a->collide(*h);system("pause");} 该程序在winXP Professinal + Dev-C++上通过我在vc.net上也进行了编译,可是总是在dynamic_cast 处出现错误,不知道为什么?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有