2013-03-24 152 views
2
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 *在函数内。 有什么方法可以通过将MANY[1]更改为READ_IT;之类的其他名称来呼叫S1->READIT;函数指针

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

+5

那些所有帽子变量名都非常累人。 – 2013-03-24 18:23:52

+1

对于函数和变量,良好的命名约定是'UpperCamelCase'类型和'lowerCamelCase'。但更重要的是,一旦你决定遵循一些约定,你应该保持这种方式。 – LihO 2013-03-24 18:26:03

+0

感谢您的建议......我将在未来的编码中牢记这一点:) – 2013-03-24 18:26:57

回答

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

...

(*S)->READIT = read; 

...

S1->READIT(S1); 
0

看看Linux内核实现的(双链接)的列表,如定义here(和随后/引用文件)。他们遍布各地。大部分的操作是在宏中完成的,例如在列表的所有节点上运行一个操作。

如果您试图定义的内容越来越复杂,请退后一步,寻找更简单的替代方案。事先不要一概而论;如果不使用泛化,则是浪费;如果稍后需要某些(略)不同的东西,那么这是一个糟糕的匹配,需要解决方法或重新实现。看看C++ STL list公开的接口,这些人在这件事上想了很长时间(尽管在不同的环境中)。

或者只是咬紧牙关,并使用C++,如果你想成为完整的面向对象。

+0

感谢分享! – 2013-03-26 14:23:21