티스토리 뷰

클래스에 선언된 Static 멤버 함수 콜백 함수로 사용 예제

Static 함수는 주소가 고정이라 "클래스::함수명"으로 전달하면 쉽게 사용할 수 있다.



[main.h]

#include "modulea.h"
#include "moduleb.h"

int main(int, char **)
{
	ModuleB b;
	int closure = 16;

	b.SetCallback(ModuleA::StaticMethod, &closure); // 콜백 함수 등록(등록할 멤버함수, 사용할 데이터)

	b.DoAction(); // callback 함수 실행

	return 0;
}

SetCallback 함수를 보면 정적 함수인 StaticMethod의 주소와 사용할 데이터(closure)를 전달한다.

그 후 DoAction 함수를 호출하여 등록한 콜백함수를 호출한다.


실행 결과



[modulea.h]

#ifndef MODULEA_H
#define MODULEA_H

#include  <string>

class ModuleA
{
public:
	static void StaticMethod(const std::string &name, void *data); // 콜백함수로 사용할 static 함수 
};

#endif

ModuleA 클래스는 콜백으로 사용할 정적 함수(StaticMethod)가 선언되어 있다.


[modulea.cpp]

#include "modulea.h"
#include <iostream>

using std::cout;
using std::endl;

void ModuleA::StaticMethod(const std::string &name, void *data)
{
	int closure = *static_cast<int *="">(data);
	cout << "In static callback: '" << name << "', closure=" << closure << endl;
}

StaticMethod의 구현부이다.


[moduleb.h]

#ifndef MODULEB_H
#define MODULEB_H

#include <string>
#include <stdlib.h>

/// 콜백함수를 등록하고 필요할때 콜백함수를 호출하는 클래스
///
class ModuleB
{
public:
	typedef void (*CallbackType)(const std::string &name, void *data); /// 사용할 콜백타입 정의

	ModuleB();

	void SetCallback(CallbackType cb, void *data); /// 콜백 함수를 등록
	void DoAction(); 	/// 콜백 함수 호출

private:
	CallbackType mCallback;
	void         *mClosure;
};
#endif

ModuleB 클래스는 콜백함수를 등록하고 호출을 담당한다.


[moduleb.cpp]

#include "moduleb.h"

ModuleB::ModuleB() : mCallback(NULL), mClosure(NULL)
{
}

void ModuleB::SetCallback(CallbackType cb, void *data)
{
	mCallback = cb;
	mClosure = data;
}

void ModuleB::DoAction()
{
	if (mCallback)
	{
		(*mCallback)("Hello World", mClosure);
	}
}

SetCallback함수에서는 콜백함수를 등록하고 

DoAction 함수에서 등록된 콜백 함수를 호출한다.

'프로그래밍 > 코드' 카테고리의 다른 글

일반 멤버 함수 콜백으로 사용  (0) 2018.06.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함