我猜使用函数指针的结构体里面有事情做了结构内封装功能...? 如果是这样,那么究竟是这样实现的?
而且它带来什么好事,有一个结构里面一个函数指针,而不是简单地定义功能?
我猜使用函数指针的结构体里面有事情做了结构内封装功能...? 如果是这样,那么究竟是这样实现的?
而且它带来什么好事,有一个结构里面一个函数指针,而不是简单地定义功能?
内部结构的函数指针是对象编程的C中的碱(见http://www.planetpdf.com/codecuts/pdfs/ooc.pdf )。 这是真的为中到大型C项目。
一个例子:
标题:
typedef struct TPile
{
int(*Push)(struct TPile*, int);
int(*Pop)(struct TPile*);
void(*Clear)(struct TPile*);
void(*Free)(struct TPile*);
int(*Length)(struct TPile*);
void(*View)(struct TPile*);
int Nombre;
struct Titem *Top;
} TPile ;
资源:
TPile TPile_Create()
{
TPile This;
TPile_Init(&This);
This.Free = TPile_Free;
return This;
}
TPile* New_TPile()
{
TPile *This = malloc(sizeof(TPile));
if(!This) return NULL;
TPile_Init(This);
This->Free = TPile_New_Free;
return This;
}
void TPile_Clear(TPile *This)
{
Titem *tmp;
while(This->Top)
{
tmp = This->Top->prec;
free(This->Top);
This->Top = tmp;
}
This->Nombre = 0;
}
有内部结构的函数指针将是某些数据结构非常有用,如二叉搜索树。
比方说,我想插入一个元素,它的结构是
struct Employee {
int eid;
char *name;
};
成二叉搜索树。 但我想BST用我的功能,而存储和搜索的元素比较。
和BST结构将作如下。
struct BST {
struct _node *root;
int (*compare)(void *e1 , void *e2);
};
现在,如下我将使用BST。
int main(void){
struct Emp e1 = { 1, "John" };
struct BST *t = create_tree();
t->set_compare( &compare );
t->insert(e1);
t->get(e1);
...
}
int compare(void *e1 , void *e2)
{
//type cast e1, e2 as struct Emp
// return the comparison result based on id
}
优点我看到的是我不需要这个函数指针不断传进我的BST操作功能。
但里面存储结构的所有公共职能将带来OOP风格里面的C代码,像其他人说的话。
假设函数取2个变量,并调用4种不同的功能。 让我们有一个结构如下:
/* Input 1 Input 2 Function pointer
{
{ 0, 0, Function00},
{ 0, 1, Function01},
{ 1, 0, Function10},
{ 1, 1, Function11}
}
这将是很容易的输入值对结构值进行比较,并调用相应的功能。
这似乎是最好的if..else使用...但认为其中有要检查100多例这样的病例
在结构中具有定义的函数指针的benifit,是相关的代码的设计。 我们的目标是让你的代码更有条理。
在一个结构限定的变量和函数是类似于面向对象的语言定义类
请参考以下链接了解更多详情