こんにちはに縮小コードを。ここには機能 - だから私は、とても良い、これまで抽象入力ダブルディスパッチは、C++でのInputMapのために失敗した - 私は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();
};
}
を持っています。今、私は私の抽象入力クラスからの私の最初の本当の入力を導き出す:私は期待して当然の
//main.cpp
MyInputMap map;
StringInput input;
input.SetMessage("Test");
input.Dispatch(&map);
:
//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();
};
、ここではテストですそのinput.Dispatch(&map)
はmap.HandleInput(StringInput input)
を呼び出しますが、残念ながらデフォルトのハンドラが常に呼び出されます。私はこのパターンを間違ってプログラムしましたか?ありがとう、私は永遠に私のコードを見てきましたが、私はそれを見ません。関数ルックアップとオーバーロード解決
あなたは今、それを必要はありません。 –
'INPUT'には注意してください。あなたは、マクロとの衝突を見つけ出すかもしれません。大会では、マクロはすべて大文字であるため、避けることをお勧めします。 –
は実際に私は、私はちょうどこの周りだと思う:私はちょうど私のクラスのStringInputに派遣(MyInputMap * PMAP)を追加しました:INPUT ::入力し、今私が動作するようです。 –