Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的方法查找_C_Lookup - Fatal编程技术网

C语言中的方法查找

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等中迭代查找它,如果在

我正在尝试用C语言制作一个游戏,使用OOP。我遇到了能够在超类中查找方法的问题

目前,我的对象大致如下所示:

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。测试。