设置参考c++

setting reference c++

本文关键字:c++ 参考 设置      更新时间:2023-10-16

我有一个Engine类,我想设置一个命令。这是标题:

class GameEngine
{
public:
GameEngine();
~GameEngine();
MoveCommand command;
void SetCommand(ICommand &);
void Start();
};

问题出在ICommand上。在主界面中,我用设置命令

engine.SetCommand(cmdRight);

其中CCD_ 2是CCD_。我不明白setCommand函数中传递了什么。

SetCommand引用一个ICommand对象。(现在,你可以把引用看作是带有不同synax的指针来使用它们)。假设ICommandMoveCommand的父类,则可以将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接口使用传入的值。不过,您必须动态地分配和取消分配对象,因此,如果您不熟悉该主题,请尝试上面的代码。

cmdRight0可以是基类,而MoveCommand是从ICommand派生的类,因此它是一个有效的参数。当您想要一个泛型函数,但不知道将使用哪个派生类时,这样做是很常见的。这个SO回答解释了继承。