通过显式传递this指针,可以在C中模拟成员函数。可以通过在每个对象中显式地存储指向函数指针的全局数组的指针来模拟虚函数。很好。
现在我的问题是,人们真的这样做吗?我想知道是否值得教授这项技术,因为我不想教给C语言新生一些在现实世界中几乎从未使用过的东西。
(我需要为已经熟悉OOP的人完成为期两周的C语言入门课程的最后一天。)
是否有任何相关的项目、库或框架以所描述的方式用C语言模拟OO?
发布于 2012-08-13 05:51:03
它可能不会在实践中使用,但学习成员函数和将对象作为第一个参数的函数之间的等价性的概念是非常有价值的。在他们的脑后有这个概念将有助于他们在未来遇到的许多问题。
日复一日,我看到人们在Stack Overflow上询问为什么将成员函数传递给需要函数指针的东西是不起作用的,诸如此类的事情。他们认为成员函数只是一些神奇的函数,是对象的一部分,并过度复杂化了整个情况。如果他们已经意识到成员函数等同于将对象作为第一个参数的函数,那么他们所面临的问题(调用方法需要成员函数指针和对象)以及可能的解决方案(以某种方式单独传递对象,或者创建某种类型的闭包来捕获对象)就会变得显而易见。显然,太多的人只是假装OO是“魔法”,并不理解这一点。
在函数式编程中,我们经常教人们如何完全按照函数的操作来编写数据结构和局部变量。这并不是说这是实用的--它可能是低效的--但这给他们留下了一些关于函数的力量的印象。它帮助他们以一种不同的方式理解事物。也许以后如果他们写一个编译器或其他什么东西,这些等价物就会派上用场。
计算机科学是关于等价和简化的,以及如何用一个问题来思考另一个问题。我们将SAT-3简化为子集sum,不是因为这实际上是我们解决SAT-3问题的实际方法,而是因为这告诉我们子集sum是NP完全的。
每隔一段时间,我就会遇到别人写的一段代码,其中非实例方法将一个指向结构的指针作为参数,我看到了一个模式,然后一个灯泡在我的脑海中熄灭,我说,啊哈,这可以被重构到一个实例方法中,因为我知道这种等价性。因此,了解这些等价物也有助于我们编写更好、更简单的代码。
发布于 2012-08-12 20:17:48
我在C语言方面有大约20年的经验,它是我学习的第一种编译语言,我从来不需要继续学习,所以它一直是C语言,而且一直只有C语言。我经常在工作和家里写代码。我已经发布了一个无锁数据结构库。我认为我是一个有能力的C程序员。
关于您的问题,OO由许多概念组成。例如,一种是实例化,例如具有new()和delete()的库以及给定实体(栈、列表等)的实例。C支持这一点,当然,它是一种非常实用和有用的方法。我已经使用这种方法大约15年了。
很多年前,我开始尝试另一个OO概念,继承在C++中得到了很好的支持。我想要一个包含其他实体的实体。然后,问题就是暴露所包含实体的API。您可以做到这一点,但事实是,C语言并不自然地表达这样的概念和方法。这不是我现在使用的东西。
我的建议是:刀就是刀,叉子就是叉子。您可以使用其中一个作为另一个,但它不能很好地工作。C本身并不支持一些(重要的) OO概念,比如继承。不要试图让C去做这些事情。如果要执行此操作,请使用C++。
发布于 2012-08-12 19:41:14
是的,它们确实如此。
是否有任何相关的项目、库或框架以所描述的方式用C语言模拟OO?
我不会仅仅因为没有一流的语言支持就称之为“仿真”。参见GObject。
https://stackoverflow.com/questions/11921865
复制相似问题