6

我猜想在结构中使用函数指针与在结构中封装函数有关......?如果是这样,那么这究竟是如何实现的?

在结构中包含函数指针而不是简单地定义函数有什么好处?

4

4 回答 4

6

结构中的函数指针是 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;
}
于 2013-03-25T10:33:08.717 回答
2

在结构中包含函数指针对于某些数据结构(例如二叉搜索树)很有用。

可以说,我想插入一个结构为

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 代码中,就像其他人所说的那样。

于 2013-03-25T11:15:08.313 回答
1

假设该函数接受 2 个变量并调用 4 个不同的函数。假设有一个结构如下:

/* Input 1                Input 2                 Function pointer
{
{ 0,                       0,                   Function00},
{ 0,                       1,                   Function01},
{ 1,                       0,                   Function10},
{ 1,                       1,                   Function11}
}

将输入值与结构值进行比较并调用相应的函数会很容易。

使用 if..else... 似乎更好,但想想有超过 100 个这样的情况需要检查的情况

于 2013-03-25T10:33:42.187 回答
0

在结构中定义函数指针的好处与代码设计有关。目标是让您的代码更有条理。

在结构中定义变量和函数就像在面向对象语言中定义类

有关更多详细信息,请参阅以下链接

于 2013-03-25T10:22:01.590 回答