- 论坛徽章:
- 24
|
回复 #2 zhujiang73 的帖子
原帖由 zhujiang73 于 2007-10-8 11:19 发表
发现问题了,我好像把内存搞乱了:
成员函数指针不能转换,我这次用虚函数解决问题。
- #include <iostream>
- #include <map>
- #define FUN01 1001
- #define FUN02 1002
- #define FUN03 1003
- typedef signed int gint32;
- typedef unsigned int guint32;
- typedef signed long long gint64;
- class Base
- {
- public:
- virtual ~Base(){};
-
- protected:
- void reg_func(guint32 a_id_func, char *a_p_func);
- bool find_func(guint32 a_id_func, gint64 &g64_p_func);
- protected:
- std::map<guint32, gint64> map_func;
- std::map<guint32, gint64>::iterator it_map_func;
- typedef std::pair<guint32, gint64> Ps_Func;
-
- public:
- virtual void call_switch(guint32 a_id_func, char *ap_a){};
- virtual void show();
- };
- class SerAgent : virtual public Base
- {
- public:
- virtual void show();
- };
- class ModuleServer : virtual public Base
- {
- public:
- virtual void show();
- };
- class ModuleServerCallBack : virtual public ModuleServer, virtual public SerAgent
- {
- public:
- void init();
- void show();
- void call_switch(guint32 a_id_func, char *ap_a);
- protected:
- typedef void (ModuleServerCallBack::*P_FUNC)(char *ap_a);
- gint32 test01;
- protected:
- void fun01(char *ap_a);
- void fun02(char *ap_a);
- };
- void Base::reg_func(guint32 a_id_func, char *a_p_func)
- {
- gint64 g64_p_func;
- gint64 *p_g64;
-
- p_g64 = (gint64*)a_p_func;
- g64_p_func = *p_g64;
- map_func.insert(Ps_Func(a_id_func, g64_p_func));
- }
- bool Base::find_func(guint32 a_id_func, gint64 &a_g64_p_func)
- {
- bool found_func = false;
- it_map_func = map_func.find(a_id_func);
- if (it_map_func == map_func.end())
- {
- std::cout << "can not found function id_func = " << a_id_func << std::endl;
- }
- else
- {
- a_g64_p_func = it_map_func->second;
- std::cout << "id_func = " << it_map_func->first << std::endl;
- found_func = true;
- }
- return found_func;
- }
- void Base::show()
- {
- std::cout << "Base show" << std::endl;
- }
-
- void SerAgent::show()
- {
- std::cout << "SerAgent show" << std::endl;
- }
-
- void ModuleServer::show()
- {
- std::cout << "ModuleServer show" << std::endl;
- }
-
- void ModuleServerCallBack::show()
- {
- std::cout << "ModuleServerCallBack show" << std::endl;
- }
- void ModuleServerCallBack::init()
- {
- std::cout << "ModuleServerCallBack::init" << std::endl;
- test01 = 10;
- P_FUNC p_func;
- p_func = &ModuleServerCallBack::fun01;
- reg_func(FUN01, (char*)&p_func);
- p_func = &ModuleServerCallBack::fun02;
- reg_func(FUN02, (char*)&p_func);
- }
- void ModuleServerCallBack::call_switch(guint32 a_id_func, char *ap_a)
- {
- P_FUNC p_func;
- gint64 g64_p_func;
- if (find_func(a_id_func, g64_p_func))
- {
- memmove((char*)&p_func, (char*)&g64_p_func, 8);
- (this->*p_func)(ap_a);
- }
- }
- void ModuleServerCallBack::fun01(char *ap_a)
- {
- std::cout << "ModuleServerCallBack::fun01 out: " << ap_a << std::endl;
- }
- void ModuleServerCallBack::fun02(char *ap_a)
- {
- std::cout << "ModuleServerCallBack::fun02 out: " << ap_a << std::endl;
- std::cout << "test01 = " << test01 << std::endl;
- }
- int main(int argc, char *argv[])
- {
- Base *p_b;
- ModuleServer *p_ms;
- ModuleServerCallBack *p_cb = new ModuleServerCallBack;
- p_cb->init();
- p_b = p_cb;
- p_b->show();
- p_ms = p_cb;
- p_b->call_switch(FUN01, "123");
- p_b->call_switch(FUN02, "456");
- p_b->call_switch(FUN03, "789");
- return 0;
- }
复制代码 |
|