настройка ссылки c ++ - PullRequest
       27

настройка ссылки c ++

1 голос
/ 02 апреля 2012

У меня есть класс Engine, и я хочу установить команду.Это заголовок:

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

Проблема в ICommand.В основном я установил команду с

engine.SetCommand(cmdRight);

, где cmdRight - это MoveCommand.Я не понимаю, что передается в функции setCommand.

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

SetCommand принимает ссылку на объект ICommand.(Вы можете думать о ссылках, как если бы они были указателями с различным синтаксисом для их использования, на данный момент).Предполагая, что 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 типа ICommand* и использоватьпередаваемые значения через интерфейс ICommand.Однако вам придется динамически размещать и отменять выделение объекта, поэтому, если вы не знакомы с этой темой, попробуйте приведенный выше код.

1 голос
/ 02 апреля 2012

ICommand может быть базовым классом, а MoveCommand является производным классом от ICommand, поэтому он делает его допустимым параметром. Это довольно распространено, когда вы хотите иметь универсальную функцию, но не знаете, какой из производных классов вы будете использовать. Этот ТАК ответ объясняет о наследовании .

...