美文网首页
C++11责任链模式展示

C++11责任链模式展示

作者: FredricZhu | 来源:发表于2021-07-10 21:20 被阅读0次

    题目


    image.png

    题目不是很难,但是解起来的时候要注意一点。就是Creature指针是被放在了vector里面固化了的,就是缓存,每次计算attack攻击值和defense防御值的时候,都需要使用 base_attack和base_defense初始化临时变量,重算。不能直接在类的成员变量上加,也就是不能加在base_attack和base_defense上面。
    这里的责任链更加普遍一点,就是通过std::vector实现的。
    通过Creature 接口规范链中对象的行为。
    还有在C++中使用RTTI判断对象指针是否是 Gobin类型的方法。
    typeid(*c) != typeid(Gobin)。

    #include <vector>
    using namespace std;
    
    struct Creature;
    struct Game
    {
      vector<Creature*> creatures;
    };
    
    struct StatQuery
    {
      enum Statistic { attack, defense } statistic;
      int result;
    };
    
    struct Creature
    {
    protected:
      Game& game;
      int base_attack, base_defense;
    
    public:
      Creature(Game &game, int base_attack, int base_defense) : game(game), base_attack(base_attack),
                                                                base_defense(base_defense) {}
      virtual int get_attack() = 0;
      virtual int get_defense() = 0;
    };
    
    class Goblin : public Creature
    {
    public:
      Goblin(Game &game, int base_attack, int base_defense) : Creature(game, base_attack, base_defense) {}
    
      Goblin(Game &game) : Creature(game, 1, 1) {}
    
      int get_attack() override {
          int attack{base_attack};
          for(auto&& c: game.creatures) {
              if(c!=this && (typeid(*c)!=typeid(Goblin))) {
                  ++ attack;
              }
          }
          return attack;
      }
    
      int get_defense() override {
          int defense{base_defense};
          for(auto&& c: game.creatures) {
              if(c!=this) {
                  ++ defense;
              }
          }
          return defense;
      }
    };
    
    class GoblinKing : public Goblin
    {
    public:
      GoblinKing(Game &game) : Goblin(game, 3, 3) {}
    
      int get_attack() override {
          return base_attack;
      }
    
      int get_defense() override {
          int defense{base_defense};
          for(auto&& c: game.creatures) {
              if(c!=this) {
                  ++ defense;
              }
          }
          return defense;
      }
    };
    

    相关文章

      网友评论

          本文标题:C++11责任链模式展示

          本文链接:https://www.haomeiwen.com/subject/kohhpltx.html