Language/C++
C++ :: c#에 있는 event/delegate system 구현VallistA2016. 2. 18. 17:37
원본 글
영문 페이지 : 링크
event / delegate system 구현 해보기
이 함수 포인터는 void 형의 반환 유형과 void 함수를 가리켜야 한다.
람다에서 아무것도 쓰지 않지 않는이상 함수 포인터에 람다 기능을 할당 할 수 있다.
소스코드
먼저 소개할 코드는 Event.h 와 Event.cpp 즉 이벤트 관련된 클래스이다.
이 클래스는 EventHandler를 가지고 있는 함수라고 보면된다.
Event.h
Event.cpp
쉽게 Handler를 확장하고 사용하기 위해서 Event 라는 클래스를 만들어 사용한다.
함수 포인터의 정의를 변경하려면 notifyHandlers() 를 사용하여 조정하면된다.
이 함수는 핸들러의 변경된 사항을 체크하는데 사용된다.
C++ 11에서는 함수 객체 호출 연산자인 operator()를 사용하여 모든 객체를 저장할 수 있는 std::function 클래스가 있다.
이 std::function 오브젝트를 사용하여 어떤 호출이던 객체를 저장할 수 있으며, 지금 만들고 있는 것의 관점에서 볼 때 콜백들을 가지고 있어서 비교를 할 수 있기 때문에 굉장히 유용하게 쓰일 수 있다.
그 다음은 우리가 function 객체를 담아놓기위해 래핑한 EventHandler 클래스를 살펴보도록 하자.
EventHandler.h
EventHandler.cpp
Event 클래스 에서는 언제든지 이벤트핸들러를 관리할 수 있어야 하는데, 그 관리에는 삭제, 추가 등 이벤트가 들어가게 된다.
그러한 일들에서 EventHandler에서는 부가적으로 호출할 시 지우는 메서드와 추가되는 메서드를 만들어야 한다.
그렇기 때문에 std::function 만으로는 유동적인 사용이 제때 제때 불가능하다.
이러한 이유로 우리는 std::function을 래핑한 EventHandler 클래스를 래핑을 한 것이다.
하지만 함수 자체로 찾을 수는 없기 때문에 윗 코드를 보게되면 알겠지만 static으로 id 숫자를 호출시마다 증가를 시켜주어 몇번째 인지 생성이 되게 해줬다. 물론 이러한 것 말고도 전역으로 하여 만드는 방법도 있을 수 있지만 가장 쉬운 방법으로 코딩을 한 것 뿐이다.
이제 ID를 매칭해서 같은 숫자의 경우 삭제를 하거나 없으면 추가를 하건의 행동을 할 수 있다.
operator+= 를 통해서 간단하게 추가하고 operator-=를 통해서 간단하게 제거 할 수 있게 operator() 연산자를 사용하여 넣어주었다.
사용방법
'Language > C++' 카테고리의 다른 글
C++ :: RTTI (Run-Time Type Information) (2) | 2015.05.29 |
---|---|
C++ :: C++ Style Cast (C++ 스타일 캐스트) (0) | 2015.04.02 |
C++ 11 :: Perfect Forwarding (퍼펙트 포워딩) (1) | 2015.02.14 |
C++ 11 :: Move Semantics (0) | 2015.02.14 |
C++ 11 :: R-Value Reference (0) | 2015.02.14 |
댓글
VallistA
병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!
자고 싶습니다. ㅠㅠ
Github :: 링크
궁금한점 문의 주시면 답변드리도록 하겠습니다
VISITED
Today :
Total :
Lately Post
Lately Comment