gpt4 book ai didi

c++ - C++ 中的 InputMap 的双重调度失败 - 代码简化为简单

转载 作者:行者123 更新时间:2023-11-30 04:32:46 25 4
gpt4 key购买 nike

你好,在我当前的一个项目中,我想实现一个 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),但不幸的是默认处理程序总是被调用。我把这个模式编程错了吗?谢谢大家,我一直盯着我的代码看,但我没有看到。

最佳答案

您应该阅读 Visitor模式。

基本上,问题在于虚拟函数是静态绑定(bind)的(讽刺的),所以解决方案是在 InputMap.

class InputMap {
public:
InputMap();
virtual void HandleInput(StringInput&) = 0;
virtual void HandleInput(IntInput&) = 0;
virtual ~InputMap();
};

注意:惯例是使用纯虚方法,这样派生类就不会忘记重写方法。

当然,这会导致依赖性问题。幸运的是,您可以在包含 InputMap 的 header 中转发声明“真实”输入类型。

还有更复杂的变体(搜索 Acyclic Visitor),但你现在应该不需要它:)

关于c++ - C++ 中的 InputMap 的双重调度失败 - 代码简化为简单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7417736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com