C中对象的函数指针

时间:2013-03-24 18:22:23

标签: c arrays object function-pointers

typedef struct node{
        int term;
        struct node *next;
}node;
typedef void(*PTR )(void *);
typedef void(*PTR1)(void *,int,int);
typedef int(*PTR2)(void *,int);
typedef void(*PTR3)(void *,int);
typedef void(*PTR4)(void *,void *,void *);

typedef struct list{
      node *front,*rear;
      PTR3 INSERT;
      PTR *MANY;
      PTR DISPLAY,SORT,READ;
      PTR4 MERGE;
}list;

void constructor(list **S)
{
    (*S)=calloc(1,sizeof(list));
    (*S)->front=(*S)->rear=NULL;
    (*S)->INSERT=push_with_value;
    (*S)->READ=read;
    (*S)->SORT=sort;
    (*S)->DISPLAY=display;    
    (*S)->MERGE=merger;    

    (*S)->MANY=calloc(2,sizeof(PTR));
    (*S)->MANY[1]=read; 


}
int main() 
{
    list *S1,*S2,*S3;
    constructor(&S1);
    constructor(&S2);
    constructor(&S3);

    S1->MANY[1](S1);
    S1->SORT(S1);
    S1->DISPLAY(S1);
    return 0;
}

所有此类函数中的void *参数都被转换为函数内的list *。 有什么方法可以通过将S1->READIT;更改为MANY[1]之类的其他名称来致电READ_IT;吗?

我打算创建一个公共头文件,以便我可以将它用于我的所有程序。 由于我不知道我需要多少个函数指针,我打算创建每个函数指针类型的动态数组。

2 个答案:

答案 0 :(得分:1)

typedef struct list{
  node *front,*rear;
  PTR3 INSERT;
  PTR READIT;
  PTR DISPLAY,SORT,READ;
  PTR4 MERGE;
}list;

...

(*S)->READIT = read;

...

S1->READIT(S1);

答案 1 :(得分:0)

查看(双重链接)列表的Linux内核实现,如定义的here(和以下/引用的文件)。它们遍布各处。大多数操作都是在宏中完成的,例如在列表的所有节点上运行一个操作。

如果您要定义的内容过于复杂,请退一步寻找更简单的替代方案。不要事先概括;如果没有使用泛化则是浪费;如果以后需要稍微不同的东西,这是一个不好的匹配,需要解决方法甚至重新实现。

看看C ++ STL list公开的接口,那些人在这个问题上已经考虑了很长时间(尽管在不同的环境中)。

如果你想要成熟的OOP,或者只是咬紧牙关并使用C ++。