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() 연산자를 사용하여 넣어주었다.

사용방법



댓글

  • pragmaonce@naver.com2019.08.07 21:31 질문있어요.
    코드 마지막부분,

    EventHandler DoSomething2 = []() { ... };

    이 구문에서 대입 연산자 우측의 []() 이것은 무엇을 의미하는건가요? 처음 보는 문법이라.. 비쥬얼스튜디오2017에서도 에러가나는데, 혹시 알려주실수 있나요?

댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 18

Total : 341,807

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘