Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中结构内部的函数指针_C_Structure_Function Pointers - Fatal编程技术网

C语言中结构内部的函数指针

C语言中结构内部的函数指针,c,structure,function-pointers,C,Structure,Function Pointers,我试图用面向对象的C语言实现ArrayList(java中使用的动态数组)。我已经定义了以下结构。(将其视为伪代码) 我的问题是,有没有可能这样做 struct ArrayList* aL=newArrayList(); aL->add(element); /*I want to do it like this*/ aL->add(&aL, element); /*And not like this*/ 我不想再次传递ArrayList的引用。 我曾想过在add函数的实现中

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

我的问题是,有没有可能这样做

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(元素)比如,我们在面向对象语言中访问方法的方式

您正试图将面向对象的范例应用到C语言中,在这种特殊情况下,C语言注定会失败

事实上,面向对象的习惯用法
aL->add(element)
只是
add(aL,element)
的一个简短结尾。例如,如果采用Python,则可以使用这两种语法。另外,C++内部机制允许考虑<代码> al> /COD>对象作为方法的第一个参数:代码> Advices(<)/C> 我首先告诉您接受C不提供内置的面向对象语法,如果您想用C编写
aL->add(element)
,那么就编写
add(aL,element)


您将更好地符合C语言的精神,并了解到
aL->add(element)
只是一个语法习惯用法,告诉您第一个参数(对象本身)是一个特殊参数,仅此而已。

您的函数指针定义是错误的,因为编译器不知道它使用什么参数,并假定它们为int

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

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*/
};
现在编译器知道它必须传递指针&结构本身

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


使用标准C++,你找不到包含这个函数指针的对象。但在C语言中,由于缺少以不可移植的方式将数据转换为代码,所以不能。C++通过<代码> < <代码>,但它隐含地。在纯C语言中,你必须自己传递结构指针。我可以问一下为什么有3个人对此进行了投票吗?这里有很多错误。您从未设置过该函数指针。它为两个提议的签名声明了错误的参数列表。你试图把C完全重新想象成一种语言的基本理解清楚了它不是,而是另一种语言存在的东西。@下划线\d我想我们可以把这段代码看作“伪C”代码,很好地揭示了C语言中某些C++特征的模拟是很困难的,因此代码的错误并不重要,函数调用的语法与面向对象无关。如果愿意,可以用C编写OO代码。你不能改变函数调用语法的工作方式,但是语法在很大程度上是不相关的。这个答案中有很多混淆。OO是一种程序设计方法,它不规定更新私有成员变量的语法等细节。C语言对OO没有直言不讳的语言支持,但您可以用C语言编写OO程序<代码>添加(元素)

绝不比添加(元素)更“面向对象”。在这两种情况下,
aL
是对象,
add
是成员函数,
element
是传递的参数。这不是答案。函数指针没有正确声明,对它的任何调用都是UB。这本身也不是答案;发布的代码还存在许多其他问题。该
add()
指针是否打算将实例作为第一个参数?但作为实例成员又有什么意义呢?没有迹象表明OP需要函数随实例的不同而变化,因此将其存储在每个实例中会浪费空间。此外,即使它是一个虚拟函数,它们也是按类结构存储的,而不是按实例存储的。我担心的是,给OP一些尽可能接近他们要求的东西会鼓励糟糕的设计。@underline\d我们不是来教人们(至少我不是)如何设计程序的。我刚刚注意到UB。“使用标准C你找不到包含这个函数指针的对象。”这部分答案是相关的,回答了我的问题。我会接受你的回答,如果你编辑它保留相关部分和详细说明。谢谢你!
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*/
};