我想以两种方式打印我创建的对象的信息。在C中调用“方法”OOP
OOP无关的第一种方法是调用print
函数。第二种方法类似于Python中的方法。我用joe->print();
,它说error: too few arguments to function ‘joe->print’
。如何处理它?
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
struct PERSON{
char *name;
int age;
int height;
int weight;
void (*print)(struct PERSON *self);
void (*destroy)(struct PERSON *self);
} ;
typedef struct PERSON person;
void person_print(person* who)
{
printf("Name: %s\n", who->name);
printf("Age: %d\n", who->age);
printf("Height: %d\n", who->height);
printf("Weight: %d\n", who->weight);
}
person *person_create(char *name, int age, int height, int weight)
{
person *who = malloc(sizeof(person));
assert(who != NULL);
who->name = strdup(name);
who->age = age;
who->height = height;
who->weight=weight;
who->print=&person_print;
return who;
}
void person_destroy(person *who)
{
assert(who != NULL);
free(who->name);
free(who);
}
int main(int argc, char *argv[])
{
person *joe = person_create("Joe Alex", 32, 64, 140);
person_print(joe);
//joe->print();
}
还有一个问题让我感到困惑,当我们破坏使用功能void person_destroy
,如何理解语句free(who->name) and free(who)
,为什么添加free(who->age)
会导致错误推广的对象。如果我释放存储结构属性的空间,是否需要free(who)
?
随着C,你必须显式*传递你的“object”*作为方法的第一个参数,OOP没有自动操作。当你想实现* virtual *方法时,你只需要将它作为函数指针的成员。对于一般的方法,你只需使用正常的功能(通常命名为' _ ()') –
'joe-> print();'。声明是'void(* print)(struct PERSON * self);'。类型是'void(*)(struct PERSON *)'。它期望一个指向'struct PERSON'的指针。你通过它的地方?将该调用更改为'joe-> print(joe);'。 –
顺便说一句,如果你想考虑的话,直接调用'print'函数仍然是OOP。它只是一个非虚拟方法的等价物,而'joe-> print'相当于一个虚拟方法。如果你有很多这样的方法,你可能想要创建一个const函数表,并在你的对象中只有一个指向它的指针。这也确保你不能混淆他们。 – spectras