代码之家  ›  专栏  ›  技术社区  ›  dutt

C++设计问题

  •  2
  • dutt  · 技术社区  · 16 年前

    我有这样的类层次结构:

    Entity  
        Stationary  
            Tree  
        Creature  
            Bear  
            Crow  
    

    我想到的一个想法是这样的。播放器::handleCollision(实体*)调用实体->handleCollisionHelper(播放器&)。这是一个虚拟函数,它在树中不做任何事情,在生物中(它应该攻击所有生物)调用Player.handleCollisionCreature(This),然后将攻击代码放入handleCollisionCreature。有没有更好的办法 不使用RTTI (typeid等)?

    4 回复  |  直到 16 年前
        1
  •  3
  •   rui    16 年前

        2
  •  2
  •   Hexagon    16 年前

    只是为官方名称提供一个参考——这个问题称为双重分派(您需要同时根据两个对象的类型决定要做什么)。

    http://en.wikipedia.org/wiki/Double_dispatch 有关详细信息,以及建议的解决方案。

        3
  •  0
  •   DanDan    16 年前

    与其在Entity*上触发,不如使用如下内容:

     handleCollision(Stationary& stationary)
     {
         // Nothing to do yet?
     }
    

     handleCollision(Creature& creature)
     {
         creature.StartCombat(this);
     }
    

    并删除实体*函数。这将确保只有生物才会开始战斗(将StartCobat功能添加到你的生物类中)。或者,你可以有一个战斗类:

     handleCollision(Creature& creature)
     {
         Combat::Begin(this, creature);
     }
    
        4
  •  0
  •   sbi    16 年前

    我想你要找的东西叫做“ double dispatch “或” multimethods ".