コールバック関数C++実装第2版


/*
             ,      
                         
*/
//def.h
#include <iostream>
#include <stdio.h>
using namespace std;

typedef enum
{
	CB_MOVE = 0,	//  
	CB_COMEBACK,	//
	CB_BUYEQUIIP,	//
}cb_type;

typedef void(*cb_func)(void *);

class CCommu //   
{
public:
	CCommu()
	{
		memset(func_list, 0, sizeof(cb_func) *(CB_BUYEQUIIP +1));
		memset(func_args, 0, sizeof(void *) *(CB_BUYEQUIIP +1));
		cout<<"sth in CCommu"<<endl;
	}

	int reg_cb(cb_type type, cb_func func, void *args = NULL)//       
	{
		if(type <= CB_BUYEQUIIP)	
		{
			func_list[ type ] = func;
			func_args[type] = args;
			return 0;
		}
	}
public:
	cb_func func_list[CB_BUYEQUIIP + 1] ;	//      
	void * func_args[CB_BUYEQUIIP +1];
};
//Gamestart.h
#include "def.h"

class CGameStart
{

public:
	CGameStart();
	~CGameStart();
	void Init();
	void run();
	void Execute();

	//      
	void static Move(void *args);
	void static Comeback(void *args);
	void static Buyequip(void *args);
	
	//  CCommu *
	CCommu * GetCommuPoint();

private:
	CCommu *m_pCommu;	//      

};
//Gamestart.cpp
#include "Gamestart.h"

CGameStart::CGameStart()
{
	CCommu *pCommu = new CCommu;//pCommu    。                  ,
								//           ,        ,      
	m_pCommu = pCommu;
}

void CGameStart::Init()	//      ,       
{
	m_pCommu ->reg_cb(CB_MOVE, Move , this);
	m_pCommu->reg_cb (CB_COMEBACK, Comeback,this );
}

void CGameStart::run()
{
	Init();
}

void CGameStart::Execute()
{
	cout<<"callback funciton is running"<<endl;

}
CGameStart::~CGameStart()
{
	if(m_pCommu != NULL)
	{
		delete m_pCommu;
		m_pCommu = NULL;
	}
}

void CGameStart::Move(void *args)
{
	CGameStart *pGame  = (CGameStart *)args;
	pGame -> Execute();
}
void CGameStart::Comeback(void *args) 
{
	//char *str = (char *)args;
	//cout << str <<endl;
}

CCommu * CGameStart::GetCommuPoint()
{
		return m_pCommu;
}
//main.cpp
#include "Gamestart.h"

int main()
{

	CGameStart *pGame = new CGameStart;
	pGame -> run();
	if(pGame->GetCommuPoint()->func_list[CB_MOVE] != NULL)//       
	{
		pGame->GetCommuPoint()->func_list[CB_MOVE](pGame->GetCommuPoint()->func_args[CB_MOVE]);
	}
	return 0;
}