这个指针指向哪里?

时间:2014-10-18 20:26:21

标签: c pointers

我正在尝试使用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_initMonster_attack函数周围徘徊。我有一个类型为Object的MonsterProto变量,其中.init设置为Monster_init函数,.attack设置为Monster_attack函数。

我认为我理解void在声明具有副作用但不需要返回某些功能的功能方面的概念。我不明白的是void * self指针到底是什么,为什么它允许我调用一个没有参数的函数?自我指针的目的是什么?

我不想在这里包含太多代码,但如果这还不足以回答问题,那么你可以找到所有code here

我欣赏正确方向的任何指示; nu pun意图:)

1 个答案:

答案 0 :(得分:1)

这段代码似乎有效地实现了一种面向对象的方法。

self是您传递给这些函数的struct Monster的地址。这些函数中的每一个都在单个对象上运行,并且将指针传递给该对象是他们如何知道要处理哪个对象。

此:

.init = Monster_init,

不是“调用没有参数的函数” - init的{​​{1}}成员是指向返回struct并接受单int的函数的指针参数,该行为其分配void *的地址。这样,如果你有一个指向对象的指针,你可以在不知道调用哪个实际函数的情况下调用Monster_init()或类似的东西。使用不同的对象,您可能使用相同的代码行调用不同的函数。