- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
gobject入门
GObject?/devel/gobject/stable/GObject?是一个基于C语言的面向对象的实现。它为C语言提供了一整套面向对象的接口,其特性有封装、继承、重载、类定义、接口、信号、引用计数等。它与?GLib?一并为?/GTK+?的两大基石。C vs C++C和面向对象,这不就是C++么?为什么要搞出另一套东西,而不直接使用C++呢?关于C与C++之争是一个大坑。Linux之父Linus就是力挺C而批判C++的。讨厌C++的人似乎认为C++过于复杂,内部机制陷阱过多等等。自己的经历不多,用C++也很少,达不到大牛们的境界,如果让我给个非要用C而不用C++的理由,我也给不出一个有说服力的。为什么研究GObject最原始的动力是,我在使用GTK+进行开发,而GObject是GTK+的基石。如果基础不牢,上层一定不会稳,因此很有必要把GObject给过一遍。知道了它的内部,才知道该如何使用它,明白它的机制与原理,做到心中有数。但是研究GObject能带来更多。由于C里没有任何面向对象机制,因此GObject把这些机制全部实现了一遍。从中可以看到一些机制的实现原理,从而对面向对象有更多的理性了解。第一步:封装面向对象的最基本需求就是封装。所谓封装,按我的理解,就是将一系列相关数据,及对这些数据有关的操作,有序的组织在一个结构中。一个圆形有x坐标、y坐标、半径三个参数,我们可以用这三个变量表示一个圆:/2010/5/26/gobject-encapsulation.18414.html?1double x, y, radius;这没什么问题。现在多了一个圆,我们又要用三个变量:/2010/5/26/gobject-encapsulation.18414.html?1double x1, y1, radius1;当我们有很多个圆的时候,可能要用到数组:/2010/5/26/gobject-encapsulation.18414.html?1double x[100], y[100], radius[100];问题在哪?x、y和radius是相互独立的。我完全可以定义100个x,200个y,150个radius。如果不只有圆,还有矩形,那么矩形的坐标叫什么呢?xx、yy?等你写了一堆代码之后回来看,到底x和y是圆的坐标,还是xx和yy是圆的坐标?所以有了struct。一个struct对数据进行了很自然的封装:/2010/5/26/gobject-encapsulation.18414.html?123struct Circle {?double x, y, radius;};好了,现在我们有了Circle这个类型。这个类型将圆的三个参数封装到了一起,从现在开始它们就是一个整体了。我可以很自然的声明一个圆,而不是它的三个参数:/2010/5/26/gobject-encapsulation.18414.html?1struct Circle c;我们也不用担心x、y、z的数量不等了,更不用担心坐标和矩形坐标命名冲突——它们定义在Rectangle这个struct里呢:)。事情还没有完。有了圆这个类型,那么对圆的操作呢?假设一个圆的操作之一为移动(move)。我们可以定义如下函数:/2010/5/26/gobject-encapsulation.18414.html?1234void circle_move (struct Circle *self, double x, double y) {?self-x = x;?self-y = y;}我们输入一个圆的指针,以及新的x、y坐标,移动操作帮助我们把指定的圆移动到新的坐标上。注意第一个参数self,是不是有点眼熟?它就是C++里的this。记得学C++时很多同学对this理解相当困难,如果看这个self就不难理解了:self就是我们要操作的那个变量,它是一个指针。C++在对象方法调用时省略了这个参数,它可以被编译器自动设置。在C里面,这个工作要我们自己做。因此移动一个圆要这么调用:/2010/5/26/gobject-encapsulation.18414.html?12struct Circle cir;circle_move (cir, 10.0, 5.0);注意self是个指针,因为C里没有引用,所以我们只能使用指针来达到传递一个对象,而不是传递它的复制品的效果。这个方法……不就是普通的函数调用嘛,根本就没把操作给封装呀。好,现给一个看起来像C++中的方法:truct Circle {?double x, y, radius;?void (*move) (struct Circle *self, double x, double y);};...struc
您可能关注的文档
最近下载
- 新能源货车运输可行性方案.pptx VIP
- GS 91011-2021特殊特性和L标记的识别、指定和处理.pdf VIP
- AI赋能:“高等数学”课程的智能化教学革新探索:利用人工智能提升教学效果与学习体验.docx VIP
- 2024年基于学科核心素养下高中生物试题命制的实践研究.docx
- 尼康Nikon COOLPIX P500数码相机(中文)说明书.pdf VIP
- 2024-2025新版人教版初中八年级物理上册(全册)优秀课件.ppt
- 卫生院财务管理制度.docx VIP
- 2025年中国医用PVC地板市场调查研究报告.docx
- 燃气工程竣工资料全套表格.pdf VIP
- 城乡幼儿移动性动作发展、执行功能与情绪理解的差异性比较.pdf
文档评论(0)