是否可以在C中模拟对象方法?

时间:2012-01-19 22:54:02

标签: c oop object emulation self-reference

是否可以在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)。看起来像是一个长镜头,但它很漂亮:)

5 个答案:

答案 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# 的面向对象编程,但有时你不得不凑合。