c - 似乎没有调用 ex19 Learn C The Hard Way 中的 void *self

标签 c oop

我已经用了 3 天的时间来学习 Learn C The Hard Way 的练习 19,但我并没有真正理解它。如果没有在 main 函数中调用,为什么需要 void *self 例如:

int Monster_attack(void *self, int damage)
{
   Monster *monster = self;
   printf("You attack %s!\n", monster->_(description));
   etc....
   etc....
}

在所有文件中我没有看到它在我只看到的主函数中被调用

Map *game = NEW(Map, "The Hall of the Minotaur.");

声明后self指针会自动带上Object吗? 例如:

Object object;

在实现中指向函数的指针会自动执行此操作?

int Monster_attack(object, some_integer);

源代码是here

我对我的语法感到抱歉,因为英语不是我的母语,我希望它足够清楚。

最佳答案

他们正在使用 void*来模拟对象。

在 C++ 中,您将声明 attack()作为类的成员函数 Monster然后这样调用它:myMonster.attack(damage);

在 C 中,由于我们没有类,它们通过使用一个额外的参数来模拟类,以传递对保存对象状态的结构的引用: Monster_attack(myMonster, damage);

所以 void *self是指向结构的指针,该结构包含适当类型的对象(结构)的成员变量。

为了使成员函数易于识别,它们使用命名约定 <class>_<function>(void* self, ...) .

关于c - 似乎没有调用 ex19 Learn C The Hard Way 中的 void *self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25741253/

相关文章:

javascript - 通过引用复制对象是否有实际用途?

python 2.7 : How to extend a class from an imported base class

mfc 中的 C++ 多态性

c - for循环在c中少扫描一次

c - 我正在尝试创建一个函数来接受用户输入的回文。为什么我输入一个数组后,它会自动输入其余的数组?

使用 printf 参数的变量调用 printf、snprintf、f_printf 等

c - 返回字符串的最后一个单词 - C 编程

c++ - 为什么编译器认为这是一个函数?

c# - 分离接口(interface)和构造函数注入(inject)

Java:将对象突变限制在特定方法内