设置参考c ++

时间:2012-04-02 18:44:43

标签: c++ reference setter

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

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

问题是ICommand。在主要部分我用

设置命令
engine.SetCommand(cmdRight);

其中cmdRightMoveCommand。我不明白setCommand函数中传递了什么。

2 个答案:

答案 0 :(得分:1)

ICommand可以是基类,MoveCommand是来自ICommand的派生类,因此它使其成为有效参数。当你想要一个泛型函数但不知道你将使用哪个派生类时,这是很常见的。这SO answer explains about inheritance

答案 1 :(得分:1)

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;
  }
}

注意:如果您在MoveCommand中没有特别需要GameEngine,则可以声明类型为command的{​​{1}}并通过ICommand接口使用传入的值。但是,您必须动态分配和取消分配对象,因此,如果您不熟悉该主题,请尝试上述代码。