Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7193077
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: C/C++

2010-06-13 11:30:02

最近项目中用到,union关联多个函数问题。感觉有些虚函数的妙处。

#include
#include


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
#include

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;
}




阅读(1842) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~