我猜想在结构中使用函数指针与在结构中封装函数有关......?如果是这样,那么这究竟是如何实现的?
在结构中包含函数指针而不是简单地定义函数有什么好处?
我猜想在结构中使用函数指针与在结构中封装函数有关......?如果是这样,那么这究竟是如何实现的?
在结构中包含函数指针而不是简单地定义函数有什么好处?
结构中的函数指针是 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 操作函数。
但是将所有公共函数存储在 struct 中会将 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 个这样的情况需要检查的情况