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.Однако вам придется динамически размещать и отменять выделение объекта, поэтому, если вы не знакомы с этой темой, попробуйте приведенный выше код.