c++ 콜백함수 예제

콜백은 지정된 시간에 인수를 다시 호출(실행)할 것으로 예상되는 다른 코드에 대한 인수로 전달되는 실행 가능한 코드입니다[Source : Wiki]. 간단한 언어로 함수의 참조가 함수를 호출하는 인수로 다른 함수에 전달되면 콜백 함수로 호출됩니다. DoItB 함수는 콜백을 의미하는 클래스 TClassB의 개체를 통해 작업을 수행합니다. 정적 함수 TClassB::래퍼_To_Call_Display에 대한 포인터가 DoItB에 전달됩니다. 이 래퍼는 콜백 함수입니다. 래퍼는 전역 변수 void* pt2Object를 사용하고 이를 TClassB의 인스턴스에 명시적으로 캐스팅합니다. 올바른 클래스 인스턴스를 가리키도록 전역 변수를 항상 초기화하는 것이 매우 중요합니다. TClassB와 같은 임의의 다른 클래스를 작성하고 이러한 다른 클래스가 필요한 함수를 제공하는 한 DoItB와 함께 사용할 수 있습니다. 참고: 이 솔루션은 변경할 수 없는 기존 콜백 인터페이스가 있는 경우에 유용할 수 있습니다. 전역 변수를 사용하는 것은 매우 위험하며 심각한 오류를 일으킬 수 있으므로 좋은 해결책이 아닙니다. 위의 함수의 경우 func1을 선언하여 함수에 대한 포인터를 가져 와서 런타임에 func2의 주소를 전달합니다. typedef를 사용하여 지저분한 구문을 더 쉽게 읽고 디버깅할 수 있습니다. 예제 15-1은 함수 포인터를 사용하여 콜백 함수를 구현하는 방법을 보여 주며 있습니다.

std::vector를 사용하면 하나의 함수를 사용하여 콜백을 목록에 푸시할 수 있습니다: 내 경력 을 통해 발생한 많은 C 구현은 매우 단순합니다: 하나의 포인터만 등록할 수 있습니다! 예: std:::vector를 통해 unregister_callback API를 지원하는 것은 함수 대상을 저장하는 방법에 따라 쉽거나 어려울 수 있습니다. 지금까지 함수 포인터를 콜백으로 사용하는 방법을 보았습니다. 그러나 일부 C 함수를 C ++ 콜백과 인터페이스하려면 어떻게해야합니까? C에서 콜백 함수는 함수 포인터를 통해 호출되는 함수입니다. 이는 API의 동작 또는 결과가 인수로 전달된 콜백에 종속된다는 것을 보여줍니다. 예제 15-1에 표시된 것과 같은 상황에서는 updateProgress 및 longOperation이 서로에 대해 전혀 알지 못하면 함수 포인터가 좋은 생각입니다. 예를 들어 사용자 인터페이스(UI) 대화 상자, 콘솔 창 또는 다른 위치에 있는 사용자에게 표시하여 진행률을 업데이트하는 함수는 …