我有一个Engine类,我想设置一个命令。 这是标题:
class GameEngine
{
public:
GameEngine();
~GameEngine();
MoveCommand command;
void SetCommand(ICommand &);
void Start();
};
问题是ICommand
。在主要部分我用
engine.SetCommand(cmdRight);
其中cmdRight
是MoveCommand
。我不明白setCommand
函数中传递了什么。
答案 0 :(得分:1)
ICommand
可以是基类,MoveCommand
是来自ICommand
的派生类,因此它使其成为有效参数。当你想要一个泛型函数但不知道你将使用哪个派生类时,这是很常见的。这SO answer explains about inheritance。
答案 1 :(得分:1)
SetCommand
会引用ICommand
个对象。 (您现在可以将引用视为具有使用它们的不同synax的指针)。假设ICommand
是MoveCommand
的父类,您可以将MoveCommand
(例如cmdRight
)的引用传递给GameEngine::SetCommand()
。在SetCommand()
中,您必须将传递的引用类型转换为MoveCommand
,以便能够将值分配给command
- 否则实际对象可能具有的类型另一个ICommand
的孩子。
试试这个:
void GameEngine::SetCommand(ICommand& cmd) {
try {
MoveCommand& mcmd = dynamic_cast<MoveCommand&>(cmd);
command = mcmd;
} catch (const std::bad_cast& e) {
std::cout << "Wrong command passed: move command expected" <<
" (" << e.what() << ")" << std::endl;
}
}
注意:如果您在MoveCommand
中没有特别需要GameEngine
,则可以声明类型为command
的{{1}}并通过ICommand接口使用传入的值。但是,您必须动态分配和取消分配对象,因此,如果您不熟悉该主题,请尝试上述代码。