C++11责任链模式展示
2021-07-10 本文已影响0人
FredricZhu
题目
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;
}
};