【问题标题】:Object oriented C programming - equivalent of 'this' keyword?面向对象的 C 编程 - 相当于“this”关键字?
【发布时间】:2016-12-08 04:52:30
【问题描述】:

我正在根据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关键字的功能?

【问题讨论】:

  • C++ 中的每个对象都可以通过一个称为“this”指针的重要指针访问自己的地址。 “this”指针作为隐藏参数传递给所有非静态成员函数调用。我认为没有必要改变 c 的行为,因为 c 是 c++ 的基础,如果你改变 c 的行为,那么你如何在这两种语言中有所作为。
  • 如果您需要使用它,为什么不直接使用 C++? @SumitGemini 说,你可以手动传递一个 this 指针。

标签: c oop object this


【解决方案1】:

没有。 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 脚本或其他简单的脚本语言。

作为一名程序员,能够从一种编程语言范式切换到另一种编程语言范式意味着您能够从不同的角度看待问题。纵观当前的软件项目,最健壮、最重要、最高效的项目都是由具备这种能力的程序员编写的。

这就是为什么我在上面说过,期望一种编程语言的特性或范式可以移植到其他语言是不明智的。你不应该那样做,因为它等同于拥有一个工具,并把所有问题看作是你手头的工具是解决这些问题的唯一可能工具。 (如果你只有一把锤子,那么所有问题都开始看起来像钉子。)学习,尤其是学习接受不同编程语言中的不同范式,可以成为更好的程序员、更好的问题解决者。

【讨论】:

  • 尽管令人失望...这似乎是正确的答案,如果 C++ 确实将 this 传递给 ABI。
  • @MDXF:好吧,我不是故意让你失望的。您可以自己验证这一点,只需将一个小类编译为程序集 (g++ -S),或编译为目标文件并反汇编它(例如使用 objdump -d)。 (如果你想要证明,就这么说,我会展示以及如何重现。)即使编程语言提供了出色的工具来实现某些东西,它背后也从来没有什么奇怪的东西。只是努力工作和好的算法。我们都站在巨人的肩膀上,等等;甚至编程语言。
  • 我对答案并没有那么失望,因为我对 C 的局限性感到失望 - 我认为可能存在内存地址或全局指针之类的东西,它引用了最后使用的变量,或者调用结构/函数,类似的东西。但显然不是。那好吧;如果 C 做不到,就没有必要对此发脾气。 XD
  • @MDXF:这是对限制的一个非常奇怪的定义......因为C是一种低级编程语言,它的抽象相对简单; C++ 是一种相对高级的编程语言,具有复杂的抽象。这些抽象不是从硬件发展而来的(例如,硬件具有一些 C 没有利用的特性),而是从一个新的角度解决问题的意图。如果您想解决应用该观点的问题,请使用支持this 的语言!在 C 范式中,显式传递指向对象 common 和 natural. 的指针
  • @MDXF: TL;DR: 修改你的观点/范式,而不是语言。这样更容易,而且您会得到更好的结果。
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 2015-02-12
  • 2013-10-08
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多