是否可以在C中模拟对象方法?我希望能够将结构自引用为成员函数参数的参数,例如:
struct foo {
int a;
int (*save)(struct foo *);
};
int
save_foo(struct foo *bar) {
// do stuff.
}
struct foo *
create_foo() {
struct foo *bar = malloc(sizeof(struct foo));
bar->save = save_foo;
return bar;
}
int
main() {
struct foo *bar = create_foo();
bar->a = 10;
bar->save();
}
bar->save()
,实际上调用了save_foo(bar)
。看起来像是一个长镜头,但它很漂亮:)
答案 0 :(得分:4)
不,这是不可能的。 C中有面向对象的库,但它们将“this
”对象明确地传递给“方法”,如
bar->save(bar);
有关此样式的示例,请参阅Berkeley DB C API,但如果您想以类C语言执行OO,请考虑使用C ++或Objective-C。
答案 1 :(得分:2)
基本上没有。 C中函数的引用只是一个指向它所在位置的指针,当你调用它时,你只是从结构中获取指针,跳转到那里继续执行而不需要任何关于上下文或堆栈的知识,所以有无处可去。“
答案 2 :(得分:1)
答案是“是的。”
证据是第一批C ++编译器根本不是编译器。他们只是将C ++代码翻译成C代码。 CFront编译器就是这样做的。
我从其他答案中看到我可能误解了你的问题。不,你在问题中写的语法在C中不起作用。你需要编写自己类型的预处理器/翻译器来将呼叫从bar->save()
转换为foo_save(bar)
甚至{{1} }。
答案 3 :(得分:1)
是的,将bar
传递给save
函数指针,你将获得C ++所做的内容(无形地传递this
作为方法的第一个参数) 。您无法在C中自动传递this
(又名bar
。
答案 4 :(得分:0)
是的,这只是尴尬。我已经使用命名的公共块在 Fortran77 中实现了对象。
在 C 中,结构可能是要走的路。如果您不想传递结构,您可以将它们设为全局并以这种方式访问它们。无论您选择什么解决方法,都要好好评论!
有时必须使用 C 而没有 C++、Objective C 等可用。我喜欢 Java 和 C# 的面向对象编程,但有时你不得不凑合。