繁体   English   中英

面向对象的C编程-等同于“ this”关键字?

[英]Object oriented C programming - equivalent of 'this' keyword?

基于答案,我正在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关键字的功能吗?

不可以。C++中的this关键字是对当前对象的引用,实际上是在ABI级别上显式传递给成员函数的。 在函数中显式传递指向对象的指针(作为第一个参数)是C语言中的最佳等效项。请注意,这意味着

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

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

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


期望在一种编程语言中看到的功能在其他某种编程语言中仍然有效,即使这两者之间存在某种联系也是理智的。

您会看到,每种编程语言都有自己的解决问题的方法,自己的范例 因为没有通用的最佳范例 ,所以使用具有最适用/最有效/最有用范例的编程语言可以最好地解决问题。 例如,您不必编写C ++程序来加快常见的命令行任务; 您可以使用Shell脚本或其他简单的脚本语言来代替。

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

这就是为什么我在上面说过,期望一种编程语言的功能或范例可以移植到其他语言并不明智。 您不应该这样做,因为这等效于拥有一个工具,并且将所有问题视为您手中的工具是解决问题的唯一可能工具。 (如果您只有锤子,所有问题都会像钉子一样开始。)学习(尤其是学会接受)不同编程语言中的不同范例,将成为一个更好的程序员,一个更好的问题解决者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM