美文网首页
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