实现类头文件
#pragma once
#include <unordered_map>
class DataTranslate; //首先声明当前类名
typedef void(DataTranslate::*DataDealFunc)(DataInteractionBase*)
//防止多个文件重复定义,使注册函数唯一,宏定义可以调用多种不同函数等,本例只调用一个函数用来防止重复定义。
#ifndef RegisterFunc
#define RegisterFunc(_key, _func_ptr) \
if(!RegisterInputDataFunc(_key,(DataDealFunc) _func_ptr)) \
{\
std::cout<<"DataManager.h 77 - RegisterFunc-" << _key << "-注册失败" << std::endl; \
return false; \
}
#endif
class DataTranslate
{
public:
DataTranslate();
`DataTranslate();
protected:
//函数注册表
virtual bool RegisterDealFunc() = 0;
bool RegisterFunc(std::string _key, DataDealFunc _func);
private:
std::unorderd_map<std::string, DataDealFunc> data_deal_func_map_; //注册到此map中
};
实现类源文件:
#inlcude "data_manager.h"
DataTranslate::DataTranslate(){}
DataTranslate::`DataTranslate(){}
bool DataTranslate::RegisterInputDataFunc(std::string _key, DataDealFunc _func)
{
auto iter = data_deal_func_map_.find(_key);
if(iter!=data_deal_func_map_.end())
return false;
data_deal_func_map_[key] = _func;
return true;
}
使用类头文件:
#include "data_manager.h"
class KKK:
public DataTranslate //先继承上面那个类
{
public:
KKK();
`KKK();
protected:
virtual bool RegisterDealFunc() override;
private:
bool ppp();
使用类源文件:
#include "kkk.h"
KKK::KKK()
{
RegisterDealFunc();
}
KKK::`KKK(){}
bool KKK::RegisterDealFunc()
{
RegisterFunc(key,&KKK::ppp);
return true;
}
bool KKK::PPP()
{
return true;
}