2013-05-22 4 views
0

아주 잘 작동하는 이벤트 핸들러 메커니즘을 작성했습니다. 은 그래서 더 일반화 될 수 있도록 확장하고 나에게 키보드 상태를 제공하는 이벤트 핸들러를 썼다 :정적 객체 인스턴스에 정적 멤버 변수가 있어야합니까?

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 클래스는 정적 라이브러리에 있으며 다른 실행 파일에서 링크됩니다.

+0

템플릿에서 상속하는 것은 내가 자주하는 일이 아니기 때문에이 템플릿이 부적절하거나 잘못 되었다면 실례지만 클래스의 정의에서 KeybdHandler는 KeybdHandler (같은 클래스) 유형의 템플릿을 상속받습니다. 그렇다면 동일한 클래스 변수가 여러 버전이 있다는 의미가 아니므로 설정중인 변수가 검색중인 변수가 아닙니다. 그렇다면 get 및 set 접근 자에서 비 정적 변수의 주소를 출력하고 일치하는지 확인하십시오. – TheDarkKnight

+0

@ Merlin069, 상위 클래스는 실제로 관련이 없습니다. http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – fishfood

+1

정말 재미 있습니다. 링크를 가져 주셔서 감사합니다. – TheDarkKnight

답변

1

g_evtKeybd을 전역 정적 변수로 선언했습니다. 이 문맥에서는 static의 의미가 다릅니다. 각 컴파일 단위의 의도는 사용자가 의도하지 않은 g_evtKeybd의 인스턴스입니다. 정적 멤버는 클래스의 모든 인스턴스에서 공유하므로 인스턴스가 여러 개 (실제 실수가 숨겨져 있음)에도 모든 멤버가 동일한 멤버를 반환합니다.

+0

머리에 못을 박은 것 같아요. 고마워. 조. 나는 keybd와 마우스 핸들러에서 Singleton을 만들어야한다고 생각한다. :) – fishfood