我有一个Engine类,我想设置一个命令。这是标题:
class GameEngine
{
public:
GameEngine();
~GameEngine();
MoveCommand command;
void SetCommand(ICommand &);
void Start();
};
问题出在ICommand
上。在主界面中,我用设置命令
engine.SetCommand(cmdRight);
其中CCD_ 2是CCD_。我不明白setCommand
函数中传递了什么。
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;
}
}
注意:如果GameEngine
中没有特别需要MoveCommand
,则可以声明类型为ICommand*
的command
,并通过ICommand接口使用传入的值。不过,您必须动态地分配和取消分配对象,因此,如果您不熟悉该主题,请尝试上面的代码。
cmdRight
0可以是基类,而MoveCommand
是从ICommand
派生的类,因此它是一个有效的参数。当您想要一个泛型函数,但不知道将使用哪个派生类时,这样做是很常见的。这个SO回答解释了继承。