Callback and Class

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의 콜백 함수로써 사용이 불가능하며, 굳이 사용해야 할 경우 반드시 ‘정적 멤버 함수’로 만들어야 한다. 이로써 문제점이 명확히 제시되었다.

“우리는 어떻게 해서든 클래스의 멤버 변수를 사용하고 싶다!”

차례로 돌아가기