面向对象的C编程 - 相当于'this'关键字?

时间:2016-12-08 04:52:30

标签: c oop object this

我正在基于this回答在C中尝试OOP。我遇到了一些我无法解决的问题。举个例子:

struct foo {
    int val;
    int (*bar)(struct foo, int);
}

int foo_bar(struct foo mod, int val)
{
    mod.val = val;
}

int main(void)
{
    struct foo foo;
    foo.bar = foo_bar;
    foo.bar(foo, 8);
}

如果有办法在C中使用this关键字,我认为会更简单明了:

struct foo {
    int val;
    int (*bar)(struct foo, int);
}

int foo_bar(int val)
{
    this.val = val;
}

int main(void)
{
    struct foo foo;
    foo.bar = foo_bar;
    foo.bar(8);
}

这听起来不可能,但可能会有一些解决方法,有点像C本身的OOP。有没有办法在面向对象的C中实现this关键字的功能?

1 个答案:

答案 0 :(得分:5)

没有。 C ++中的this关键字是对手头对象的引用,实际上是显式传递给ABI级别的成员函数。在函数中显式传递指向对象(作为第一个参数)的指针是C中最好的等价物。注意这意味着

struct foo {
    int   value;
    int (*func)(struct foo *, int);
};

void foo_bar(struct foo *f, int value)
{
    f->value = value;
}

即。对象的指针作为第一个参数传递,而不是结构本身。这使得通过引用传递对象,并使理解和维护这些代码更容易。

期望在一种编程语言中看到的功能在某些其他编程语言中有效是不合理的,即使两者在某种程度上是相关的。

你知道,每种编程语言都有自己的问题解决方法,他们自己的paradigm。因为没有通用的最佳范例可能,所以使用具有最适用/有效/有用范例的编程语言可以最好地解决问题。例如,您不编写C ++程序来加速常见的命令行任务;您可以使用shell脚本或其他简单的脚本语言。

作为程序员,能够从一种编程语言范例切换到另一种编程语言范例意味着您能够从不同的角度查看问题。看看当前的软件项目,最强大,最重要,最有效的项目是由具备这种能力的程序员编写的。

这就是为什么我在上面说过,期望一种编程语言的特性或范例可以移植到其他编程语言是不合理的。你不应该这样做,因为它相当于拥有一个工具,并且看着所有问题,好像你手头的工具是解决它们的唯一可行工具。 (如果你所拥有的只是一把锤子,那么所有的问题都会像钉子一样开始。)学习,特别是学会接受不同编程语言中的不同范例,可以使一个更好的程序员,更好的问题解决者。