【发布时间】:2018-04-02 18:32:28
【问题描述】:
我正在尝试在 C++ 中实现命令和策略设计模式。
我有一个命令界面和一个策略界面(为每个玩家分配不同的策略,因此玩家可能是手动的、AI 攻击性的、AI 防御性的、AI 随机的……等等)。这些策略有一系列函数,它们返回一个 ICommand 类型的唯一指针(例如命令接口),该指针指向派生命令类的实例。这个想法是以特定方式在我的策略中创建一些命令,然后将指向特定命令的唯一指针返回给执行命令的游戏(命令的调用者),而不管该命令是什么。
我的以下问题是:
如果我移动由基类的唯一指针指向的派生类的实例,我会得到对象切片吗?
如果是这样,无论对象的类型如何,处理移动对象的更好方法是什么?
这是我的代码。请注意,我只包含了命令 choose_combo 的代码,因为其余部分有些多余:
我的标准命令有一个接口:
class Igame_command {
protected: // protected, since Igame_command is an interface.
player &p;
game_model &gm;
Igame_command(player p, game_model gm) : p(p), gm(gm) {}
public:
virtual void execute() = 0;
};
然后我有一些实现上述接口的派生类:
class choose_combo_c : private Igame_command {
combo c;
int vp;
public:
void set_combo(combo c) { this->c = c; }
void set_vp(int vp) { this->vp = vp; }
combo get_combo() { return c; }
int get_vp() { return vp; }
choose_combo_c::choose_combo_c(player &p, game_model &gm);
void execute() override;
};
然后我有一个用于我的策略的界面:
class Istrategy {
protected:
application &app;
game_model &gm;
player &p;
Istrategy(application &app, game_model &gm, player &p) : app(app), gm(gm), p(p) {}
public:
virtual std::unique_ptr<Igame_command> choose_combo(
std::vector<combo> &available_combos, std::vector<int> &available_combos_vp) = 0;
};
例如,对于手动策略,选择组合:
std::unique_ptr<Igame_command> manual_strategy::choose_combo(
std::vector<combo> &available_combos, std::vector<int> &available_combos_vp) override {
// code to have the player make a choice, it sets the int choice...
choose_combo_c* ccc = new choose_combo_c(p, gm);
ccc->set_combo(available_combos.at(choice));
ccc->set_vp(available_combos_vp.at(choice));
return std::unique_ptr<Igame_command> (new choose_combo_c(std::move(*ccc)));
}
【问题讨论】:
-
切片只能在复制到基类时发生。重新分配指针永远不会导致切片。
标签: c++ c++11 design-patterns smart-pointers unique-ptr