C-Style의 callback 코드에 살짝 C++ 개념을 얹어 보자.
#include <iostream> // 전역변수 콜백 함수 포인터. // 어떤 라이브러리 어딘가에 있다고 가정한다. void (*g_callback)(void) = NULL; // 우리는 C-Style의 함수가 아닌 class를 필요로 한다. // C++에서 class와 struct의 차이는 단지 private이 기본이냐, public이 기본이냐의 차이다. struct cb_class { // 라이브러리는 이 함수를 필요로 한다. // static 키워드를 포함할 때와 그렇지 않을 때를 비교하라. static void callback(void) { std::cout << "Our callback function is called.n"; } }; int main(int argc, char** argv) { // 라이브러리에 우리의 콜백 함수를 등록하는 과정이라고 가정한다. g_callback = &cb_class::callback; // g_callback이 우리가 만든 callback을 대신한다. // 현재 우리가 만든 main 함수 안에서 호출되고 있으나 // 이 while문의 구조는 라이브러리 내부 어딘가라고 가정한다. int nCount = 3; // 3회 callback 함수를 호출 while(nCount--) { g_callback(); } return EXIT_SUCCESS; }
static 키워드를 붙이지 않았을 경우,
error C2440: ‘=’ : cannot convert from ‘void (__thiscall cb_class::* )(void)’ to ‘void (__cdecl *)(void)’
에러를 내며 컴파일이 올바르게 수행되지 않는다.
클래스의 멤버 함수는 C-Style의 콜백 함수로써 사용이 불가능하며, 굳이 사용해야 할 경우 반드시 ‘정적 멤버 함수’로 만들어야 한다. 이로써 문제점이 명확히 제시되었다.
“우리는 어떻게 해서든 클래스의 멤버 변수를 사용하고 싶다!”