C语言中的方法查找
我正在尝试用C语言制作一个游戏,使用OOP。我遇到了能够在超类中查找方法的问题 目前,我的对象大致如下所示:C语言中的方法查找,c,lookup,C,Lookup,我正在尝试用C语言制作一个游戏,使用OOP。我遇到了能够在超类中查找方法的问题 目前,我的对象大致如下所示: typedef unsigned int PTR struct Object{ PTR super; PTR (method1 (PTR self, ...)); . . . PTR (methodN (PTR self, ...)); } 我想查找一个方法,如果在对象中找不到它,则在它的super、它的super等中迭代查找它,如果在
typedef unsigned int PTR
struct Object{
PTR super;
PTR (method1 (PTR self, ...));
.
.
.
PTR (methodN (PTR self, ...));
}
我想查找一个方法,如果在对象中找不到它,则在它的super、它的super等中迭代查找它,如果在某个点super==NULL
,则返回0(找不到方法)
如何实现这一点?您可以通过一个简单的循环来实现:
typedef PTR (*MPTR)();
MPTR lookup_method1(struct Object obj) {
MPTR res;
do {
res = obj->method1;
obj = obj->super;
} while (!res && obj);
return res;
}
循环沿着继承层次结构的链接向上遍历,直到找到合适的方法
然而,你的方法相当缓慢。您应该预先遍历层次结构,并将所有
NULL
s设置为父级的指针。这样,您可以快速查找;如果指针为NULL
,则没有实现。常用的方法不是在超类中搜索实现,而是在派生类中包含超类的方法表。为您节省了很多麻烦:
typedef struct SUPER {
int attribute1;
int attribute2;
int (*method1)(struct SUPER *self, int arg1, int arg2);
int (*method2)(struct SUPER *self, char *ptr);
} SuperClass_t;
typedef struct SUB {
struct SUPER superclass;
int (*method3)(struct SUB *self);
} SubClass_t;
在派生类中查找超类实现非常容易:
// Call superclass method
void subClassMethod (SubClass_t *self, char *ptr){
self->superclass->method2 (&(self->superclass), ptr);
}
如果您希望它更接近“真正的”OOP语言,请不要将方法指针存储在实例中,而是使用一个到VMT的间接寻址,该VMT由实际持有方法指针的所有实例共享。在调用方法时添加了另一个间接寻址,但在构造函数中为您节省了大量初始化代码,因为您仅在第一次实例化特定类的实例时才需要这样做。&@user2357112我正在使用从MRI中学到的一些实践:(查找值)@user2357112为什么你认为这不好?我怎么能做到?使用一个实际的OO语言,比如C++,并为你做了吗?@ Cstruou:好的,首先,代码> PTR < /C>不是指针,它很小,不能保存指针。OP在这里可能走得太远了,但是你可以很好地在C中进行OOP。只需看看大多数更大的项目,例如Linux内核!面向对象编程的继承方法不仅仅是C++/Java;其他的可能更适合C实现。无论如何,使用Java肯定是最糟糕的建议之一。你甚至不知道目标上有一个字节码解释器!很抱歉,我认为我不够清楚,我希望能够查找任何方法,而不是使用函数查找每个方法(我不希望整个游戏中的每个方法都有
lookup\u method1,…,lookup\u methodN
)。但是,一个让我沿着调用(“method”,obj)
@csTroubled C这样的函数缺少反射功能,因此需要一些方法来识别字段名称以外的方法。一旦你有了它(例如,一个带有索引的数组),你就应该能够生成一个函数,该函数使用该机制为所有查找生成一个函数。@dasblinkenlight:顺便说一句,这将消除编译器的类型检查,从而消除这方面的任何帮助。听起来这是一个非常糟糕的主意,对于一个没有经验的用户来说更是如此。我甚至不会考虑调试resp。测试。