C语言中结构内部的函数指针
我试图用面向对象的C语言实现ArrayList(java中使用的动态数组)。我已经定义了以下结构。(将其视为伪代码) 我的问题是,有没有可能这样做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函数的实现中
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*/
};