union中存放函数地址
时间:2010-06-13 来源:wwm
最近项目中用到,union关联多个函数问题。感觉有些虚函数的妙处。
#include <stdio.h>
#include <string.h>
typedef void (*FUN)(); //空函数类型。用于指针转换。类似虚函数
typedef void (*FUN1)(int a);
typedef int (*FUN2)(int a,int b);
typedef char * (*FUN3)(char* a);
typedef struct {
int a;
union{ //在结构内只有一个函数地址
FUN fun;
FUN1 fun1;
FUN2 fun2;
FUN3 fun3;
};
}ST_FUN;
void f() //空函数。用于指针转换
{
}
void f1(int f)
{
printf("size ==%d\n",f);
}
int f2(int a,int b)
{
return (a+b);
}
char * f3(char *a)
{
return a;
}
ST_FUN funcs_list[]={ //定义时候要转换 为虚的
{1,(FUN)f1},
{2,(FUN)f2},
{3,(FUN)f3},
};
int main(int argc, char ** argv)
{
funcs_list[0].fun1(345); //直接使用了。这点不同于虚函数
int f = funcs_list[1].fun2(1,2);
printf("ok ---%d\n",f);
char *p = funcs_list[2].fun3("wwm");
printf("ok ---%s\n", p);
printf("ok ---end\n");
return 0;
}
//////////以下是类函数指针/////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
class TEST;
typedef void (TEST::*FUN)(); //空函数类型。用于指针转换
//或者 typedef void (*FUN)();
typedef void (TEST::*FUN1)(int a);
typedef int (TEST::*FUN2)(int a,int b);
typedef char * (TEST::*FUN3)(char* a);
typedef struct {
int a;
union{
FUN fun;
FUN1 fun1;
FUN2 fun2;
FUN3 fun3;
};
}ST_FUN;
void f() //空函数。用于指针转换
{
}
class TEST
{
public:
void f1(int f)
{
printf("size ==%d\n",f);
}
int f2(int a,int b)
{
return (a+b);
}
char * f3(char *a)
{
return a;
}
};
ST_FUN funcs_list[]={
{1,(FUN)&TEST::f1},
{2,(FUN)&TEST::f2},
{3,(FUN)&TEST::f3},
};
int main(int argc, char ** argv)
{
TEST test;
(test.*(funcs_list[0].fun1))(345);
int f = (test.*(funcs_list[1].fun2))(1,2);
printf("ok ---%d\n",f);
char *p = (test.*(funcs_list[2].fun3))("wwm");
printf("ok ---%s\n", p);
printf("ok ---end\n");
return 0;
}
#include <stdio.h>
#include <string.h>
typedef void (*FUN)(); //空函数类型。用于指针转换。类似虚函数
typedef void (*FUN1)(int a);
typedef int (*FUN2)(int a,int b);
typedef char * (*FUN3)(char* a);
typedef struct {
int a;
union{ //在结构内只有一个函数地址
FUN fun;
FUN1 fun1;
FUN2 fun2;
FUN3 fun3;
};
}ST_FUN;
void f() //空函数。用于指针转换
{
}
void f1(int f)
{
printf("size ==%d\n",f);
}
int f2(int a,int b)
{
return (a+b);
}
char * f3(char *a)
{
return a;
}
ST_FUN funcs_list[]={ //定义时候要转换 为虚的
{1,(FUN)f1},
{2,(FUN)f2},
{3,(FUN)f3},
};
int main(int argc, char ** argv)
{
funcs_list[0].fun1(345); //直接使用了。这点不同于虚函数
int f = funcs_list[1].fun2(1,2);
printf("ok ---%d\n",f);
char *p = funcs_list[2].fun3("wwm");
printf("ok ---%s\n", p);
printf("ok ---end\n");
return 0;
}
//////////以下是类函数指针/////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
class TEST;
typedef void (TEST::*FUN)(); //空函数类型。用于指针转换
//或者 typedef void (*FUN)();
typedef void (TEST::*FUN1)(int a);
typedef int (TEST::*FUN2)(int a,int b);
typedef char * (TEST::*FUN3)(char* a);
typedef struct {
int a;
union{
FUN fun;
FUN1 fun1;
FUN2 fun2;
FUN3 fun3;
};
}ST_FUN;
void f() //空函数。用于指针转换
{
}
class TEST
{
public:
void f1(int f)
{
printf("size ==%d\n",f);
}
int f2(int a,int b)
{
return (a+b);
}
char * f3(char *a)
{
return a;
}
};
ST_FUN funcs_list[]={
{1,(FUN)&TEST::f1},
{2,(FUN)&TEST::f2},
{3,(FUN)&TEST::f3},
};
int main(int argc, char ** argv)
{
TEST test;
(test.*(funcs_list[0].fun1))(345);
int f = (test.*(funcs_list[1].fun2))(1,2);
printf("ok ---%d\n",f);
char *p = (test.*(funcs_list[2].fun3))("wwm");
printf("ok ---%s\n", p);
printf("ok ---end\n");
return 0;
}
相关阅读 更多 +