我正在尝试使用面向对象样式的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);
吗?
答案 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,您无法找到包含此函数指针的对象。