我正在根据这个答案在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);
}
Run Code Online (Sandbox Code Playgroud)
我认为如果有一种方法可以this在C中使用关键字,那将会更简单和清晰:
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);
}
Run Code Online (Sandbox Code Playgroud)
这听起来不可能,但可能会有一些解决方法,有点像C本身的OOP.有没有办法this在面向对象的C中实现关键字的功能?
thisC++中的No. 关键字是对手头对象的引用,实际上是在ABI级别显式传递给成员函数.在函数中显式传递指向对象(作为第一个参数)的指针是C中最好的等价物.注意这意味着
struct foo {
int value;
int (*func)(struct foo *, int);
};
void foo_bar(struct foo *f, int value)
{
f->value = value;
}
Run Code Online (Sandbox Code Playgroud)
即指向对象的指针作为第一个参数传递,而不是结构本身.这使得通过引用传递对象是明确的,并且使得理解和维护这样的代码更容易.
期望在一种编程语言中看到的特征在某些其他编程语言中有效是不合理的,即使两者在某种程度上是相关的.
你看,每种编程语言都有自己的解决问题的方法,他们自己的范例.因为没有可能的通用最佳范例,所以使用具有最适用/有效/有用范例的编程语言可以最好地解决问题.例如,您不编写C++程序来加速常见的命令行任务; 您使用shell脚本或其他简单的脚本语言.
作为程序员,能够从一种编程语言范例切换到另一种编程语言范例意味着您能够从不同的角度查看问题.看看当前的软件项目,最强大,最重要,最有效的软件项目是由具备这种能力的程序员编写的.
这就是为什么我在上面说过,期望一种编程语言的特性或范例可以移植到其他编程语言是不合理的.你不应该这样做,因为它相当于拥有一个工具,并且看着所有问题,好像你手头的工具是解决它们的唯一可行工具.(如果你拥有的只是一把锤子,那么所有的问题都会像钉子一样开始.)学习,特别是学会接受不同编程语言中的不同范例,可以让一个更好的程序员,更好的问题解决者.
| 归档时间: |
|
| 查看次数: |
636 次 |
| 最近记录: |