c++将一个类的回调函数注入到另一个类中的方法

代码如下:

#pragma once

#include <iostream>

//字节对齐
#ifdef __GNUC__
#define SNFTK_PACKED(...) __VA_ARGS__ __attribute__((__packed__))
#elif _MSC_VER
#define SNFTK_PACKED(...) __pragma(pack(push, 1)) __VA_ARGS__ __pragma(pack(pop))
#else
#error Unknown compiler
#endif

typedef void(*callbackFunc1) ();
typedef void(*callbackFunc2) (float a, float b);
typedef void(*callbackFunc3) (int a, float b);

SNFTK_PACKED(typedef struct
{
	callbackFunc1 TestFunc1;
	callbackFunc2 TestFunc2;
	callbackFunc3 TestFunc3;
} callBackFuncs);


//将Test3类中的回调函数注入到Test2中
class Test2
{
public:
	static Test2& GetInstance() { static Test2 t; return t; }
	void init(void* ptr) { cbfs = (callBackFuncs*)ptr; }
	callBackFuncs* GetCallBackFuncs() { return cbfs; }
private:
	callBackFuncs* cbfs;
};

class Test3
{
public:
	void test1() { std::cout << "321" << std::endl; }
	void test2(float a, float b) { std::cout << "654" << std::endl; }
	void test3(int a, float b) { std::cout << "987" << std::endl; }

	void init()
	{
		callBackFuncs callBacks = { 0 };
		callBacks.TestFunc1 = &(Test3::test1);
		callBacks.TestFunc2 = &(Test3::test2);
		callBacks.TestFunc3 = (Test3::test3);
		Test2 t2 = Test2::GetInstance();
		t2.init((void*)(&callBacks));
	}
};

void demo()
{
}

int main()
{

	while (1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_23350817/article/details/103440832