C中结构内的函数指针

时间:2018-04-16 08:00:40

标签: c structure function-pointers

我正在尝试使用面向对象样式的C实现ArrayList(在java中使用的动态数组)。我已经定义了以下结构。 (将其视为 代码)

struct ArrayList{
    /*structure member declarations...
     ...
    */
    void (*add)(); /*function pointer which 
points to the function which will add a new element at the end of the list*/
};

/*Function to create an ArrayList "object"*/
struct ArrayList* newArrayList(){
    /*prepare an ArrayList "object" and return*/
    return arrayList;
}

我的问题是,是否可以做类似

的事情
struct ArrayList* aL=newArrayList();
aL->add(element); /*I want to do it like this*/
aL->add(&aL, element); /*And not like this*/

我不想再次传递ArrayList的引用。 我想在add函数的实现中使用static struct ArrayList*变量,这样我就可以初始化它一次,它将在后续的函数调用中使用,但后来我认为它会在创建时产生一团糟

struct ArrayList* aL2=newArrayList();
aL2->add(element); 

我知道我们可以在某种程度上用C语言编写面向对象的代码。 但是,我们可以像在面向对象语言中访问方法那样aL->add(element);吗?

2 个答案:

答案 0 :(得分:1)

您正在尝试将面向对象的范例应用于C,在这种特殊情况下,C注定会失败。

事实上,面向对象的习语 a b <dbl> <dbl> 1 1 20 只是aL->add(element)的短端。例如,如果使用Python,则可以使用这两种语法。并且,C ++具有内部机制,允许将add(aL, element)对象视为方法aL的第一个参数。

我首先会告诉你接受 C不提供内置的面向对象语法,如果你想在C中编写add(),那么写aL->add(element)

你会更好地匹配C精神,并且知道add(aL, element)只是一个语法习惯用法,告诉你第一个参数(对象本身)是一个特殊的参数,仅此而已

答案 1 :(得分:0)

您的函数指针定义错误,因为编译器不知道它采用了什么参数并将它们假定为整数。

例如,您需要让编译器知道:

struct ArrayList;
struct ArrayList{
    struct ArrayList* prev;
    struct ArrayList* next;
    void* element; /*data*/
    void (*add)(struct ArrayList *, struct ArrayList); /*function pointer which 
points to the function which will add a new element at the end of the list*/
};

现在编译器知道它必须传递指针&amp;结构本身。

回答问题的第二部分,您只能传递新元素。您只需要找到列表中的最后一个元素。但这假设您只有一个列表。

使用标准C,您无法找到包含此函数指针的对象。