我正在尝试使用learncodethehardway c book学习c。在ex19中,我有以下代码:
int Monster_init(void *self)
{
Monster *monster = self;
monster->hit_points = 10;
return 1;
}
int Monster_attack(void *self, int damage)
{
Monster *monster = self;
printf("You attack %s!\n", monster->proto.description);
monster->hit_points -= damage;
if(monster->hit_points > 0) {
printf("It is still alive.\n");
return 0;
} else {
printf("It is dead.\n");
return 1;
}
}
Object MonsterProto = {
.init = Monster_init,
.attack = Monster_attack
};
这是对象结构:
typedef struct {
char *description;
int (*init)(void *self);
void (*describe)(void *self);
void (*destroy)(void *self);
void *(*move)(void *self, Direction direction);
int (*attack)(void *self, int damage);
} Object;
这就是怪物结构:
struct Monster {
Object proto;
int hit_points;
};
我很难在Monster_init
和Monster_attack
函数周围徘徊。我有一个类型为Object的MonsterProto
变量,其中.init
设置为Monster_init
函数,.attack
设置为Monster_attack
函数。
我认为我理解void
在声明具有副作用但不需要返回某些功能的功能方面的概念。我不明白的是void * self指针到底是什么,为什么它允许我调用一个没有参数的函数?自我指针的目的是什么?
我不想在这里包含太多代码,但如果这还不足以回答问题,那么你可以找到所有code here。
我欣赏正确方向的任何指示; nu pun意图:)
答案 0 :(得分:1)
这段代码似乎有效地实现了一种面向对象的方法。
self
是您传递给这些函数的struct Monster
的地址。这些函数中的每一个都在单个对象上运行,并且将指针传递给该对象是他们如何知道要处理哪个对象。
此:
.init = Monster_init,
不是“调用没有参数的函数” - init
的{{1}}成员是指向返回struct
并接受单int
的函数的指针参数,该行为其分配void *
的地址。这样,如果你有一个指向对象的指针,你可以在不知道调用哪个实际函数的情况下调用Monster_init()
或类似的东西。使用不同的对象,您可能使用相同的代码行调用不同的函数。