아주 잘 작동하는 이벤트 핸들러 메커니즘을 작성했습니다. 은 그래서 더 일반화 될 수 있도록 확장하고 나에게 키보드 상태를 제공하는 이벤트 핸들러를 썼다 :정적 객체 인스턴스에 정적 멤버 변수가 있어야합니까?
class KeybdHandler : public EventHandler<KeybdHandler>
{
private:
Keyboard _keybd;
public:
void SetEvent(const Keyboard::KeyEvent & evt)
{
Keyboard::KeyEvent e = evt;
// event holds the new keystate
Notify(&e);
// keystate is saved to keyboard
_keybd.SetKey(e._Key, e._bKeyDown);
}
Keyboard & GetKeybd() { return _keybd; }
};
static KeybdHandler g_evtKeybd;
KeybdHandler :: 키보드 변수는 키보드 상태를 나타냅니다 배열을 보유를 키와 부울 당 (예를 들어, 하나 개의 항목 keydown 또는 keyup을 나타내는 변수).
그래서이 KeybdHandler 클래스의 정적 인스턴스를 만듭니다.
하지만 g_evtKeybd.GetKeybd()를 호출하면 키보드 상태는 키 업 상태에서 항상 비어 있거나 비어 있습니다.
KeybdHandler :: Keyboard 변수를 정적으로 만들면 GetKeybd()는 상태가 저장된 Keyboard 개체를 반환합니다.
포함하는 개체가 정적 인 경우 왜 키보드 변수를 정적으로해야합니까?
편집 :
g_evtKeybd.SetEvent(Keyboard::KeyEvent((int)key, true));
EDIT2 : 나는 확실하지 않다가 관련이있는 경우 그냥로 SetEvent는 항상 정적 변수를 통해이라고 명확히하고자합니다. KeybdHandler 클래스는 정적 라이브러리에 있으며 다른 실행 파일에서 링크됩니다.
템플릿에서 상속하는 것은 내가 자주하는 일이 아니기 때문에이 템플릿이 부적절하거나 잘못 되었다면 실례지만 클래스의 정의에서 KeybdHandler는 KeybdHandler (같은 클래스) 유형의 템플릿을 상속받습니다. 그렇다면 동일한 클래스 변수가 여러 버전이 있다는 의미가 아니므로 설정중인 변수가 검색중인 변수가 아닙니다. 그렇다면 get 및 set 접근 자에서 비 정적 변수의 주소를 출력하고 일치하는지 확인하십시오. – TheDarkKnight
@ Merlin069, 상위 클래스는 실제로 관련이 없습니다. http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – fishfood
정말 재미 있습니다. 링크를 가져 주셔서 감사합니다. – TheDarkKnight