设置参考c++
setting reference c++
我有一个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回答解释了继承。
相关文章:
- C++错误消息*成员参考.**初学者*
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 参考资源文件VC++中的$(SolutionDir)
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 为什么在运算符重载时需要参考?
- 使 \page 和 \subpage 参考 doxygen 中的方法文档
- std::shared_ptr 自定义参考计数器
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 避免在基于反向范围的for循环实现中悬挂参考
- 通用参考 l 值不复制对象
- 标准::enable_if和通用参考的使用差异
- 标准::积累参考?
- C++丢失了参考
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 矢量的通用参考
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- C++17 和静态临时生存期的参考扩展
- C++ 参考:这两个语句有什么区别?
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?