在c++代码中,InputMap的双调度失败——简化为简单
Double dispatching fails for an InputMap in C++ - codes reduced to simplicity
你好,在我当前的一个项目中,我想实现一个InputMap。所以我有一个抽象输入
//Input.h
namespace INPUT {
class InputMap;
class Input {
public:
Input();
virtual ~Input();
virtual void Dispatch( InputMap * pMap ) = 0;
};
}
和InputMap
//InputMap.h
namespace INPUT {
class InputMap {
public:
InputMap();
virtual void HandleInput( INPUT::Input & anInput ) {
}
virtual ~InputMap();
};
}
到目前为止都很好-这里没有功能。现在我从抽象输入类中派生出第一个真正的输入:
//StringInput.h
#include "Input.h"
#include "InputMap.h"
#include <string>
class StringInput : INPUT::Input {
public:
StringInput();
virtual ~StringInput();
void Dispatch(INPUT::InputMap * pMap)
{
pMap->HandleInput( *this );
}
void SetMessage(std::string message);
std::string GetMessage() const;
private:
std::string m_message;
};
这里是衍生的InputMap
//MyInputMap.h
#include "InputMap.h"
#include "StringInput.h"
class MyInputMap: public INPUT::InputMap {
public:
MyInputMap();
void HandleInput( StringInput & anInput );
void HandleInput( INPUT::Input & anInput );
virtual ~MyInputMap();
};
,下面是测试:
//main.cpp
MyInputMap map;
StringInput input;
input.SetMessage("Test");
input.Dispatch(&map);
当然,我希望input.Dispatch(&map)
调用map.HandleInput(StringInput input)
,但不幸的是,默认处理程序总是被调用。我是否对这个模式进行了错误的编程?谢谢大家,我一直盯着我的代码,但我没有看到它。
您应该阅读访问者模式。
基本上,问题是虚函数是静态绑定的(讽刺),所以解决方案是在InputMap
中声明所有HandleInput
(对于每种Input
类型)。
class InputMap {
public:
InputMap();
virtual void HandleInput(StringInput&) = 0;
virtual void HandleInput(IntInput&) = 0;
virtual ~InputMap();
};
注意:惯例是使用纯虚方法,这样派生类就不会忘记重写一个。
当然,这会导致依赖关系的问题。幸运的是,您可以在包含InputMap
的头文件中转发声明"真正的"输入类型。
有更复杂的变化(搜索无环访问者),但你现在不应该需要它:)
在静态类型上执行函数查找和重载解析。因此,当您在StringInput::Dispatch()
中输入pMap->HandleInput(*this)
时,这总是会发现InputMap::HandleInput(Input &)
过载,因为pMap
是静态类型InputMap
。然后动态地分配给覆盖MyInputMap::HandleInput(Input &)
。
HandleInput()
函数中添加动态分派,该函数在运行时决定参数的动态类型。相关文章:
- HDF5 简单读取数据集失败
- 尝试渲染像素坐标时,简单线条渲染失败
- 简单pybind11模块失败,没有名为的模块
- OpenCV 简单 2D 矩阵乘法失败
- 模型测试 + 简单表模式 = 父测试失败
- C++编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败
- 简单的链接列表删除失败
- CMake 在尝试编译简单测试程序时失败
- 在一个简单的程序中断言失败 std::ispunct 中
- C - 多个#Define值会导致简单的算术失败
- 简单的2D数组标头文件,打印失败
- 为什么这个简单的服务器在非常低的并发请求上失败
- 具有重载<<运算符的简单模板类失败,"Invalid use of template-id"
- Winsock 简单客户端服务器,接收失败
- 模拟简单的c ++方法在使用googletest时失败
- VS Code 上的简单 GDB C++调试失败,并显示 NullReferenceException
- c++和gtest需要帮助理解为什么看似简单的测试失败了
- 简单迭代器适配器的模板匹配失败
- Mysql++ 简单脚本编译失败
- 在简单的c++程序上运行失败