鱼C论坛

 找回密码
 立即注册
查看: 3886|回复: 4

我在尝试用C语言模拟面向对象的思想,遇到问题了

[复制链接]
发表于 2013-8-15 23:01:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好,现在我正在尝试用C语言来模拟面向对象思想
以下是我目前写的代码,写不管有没有细节错误。
先解决一个瓶颈问题。
就是怎么通过结构体中的函数访问结构体中的数据变量。
我不想通过传递参数,这明显有违面向对象的思想。
求助攻
  1. #include<stdio.h>
  2. #include<string.h>

  3. const int MAX_LENGTH = 20;                             //产品名称的最大长度

  4. //打印销售信息
  5. void Show(){
  6.         printf( "%s    %.2f     %d     %.2f\n",
  7.             name, avePrice, sales, avePrice*(double)sales       
  8.                    );
  9. }

  10. //初始化函数
  11. void Initialize( char* na, double aveprice, int sa ){
  12.         strcopy( name, na );
  13.         avePrice = aveprice;
  14.         sales = sa;
  15. }

  16. typedef struct _Sales_item{
  17.         char name[ MAX_LENGTH ];             //记录产品的名称
  18.         double avePrice;                                         //记录产品的均价
  19.         int sales;                                                         //记录产品销量
  20.        
  21.         void (*Initialize)( char*, double, int );        //初始化结构体
  22.         void (*Show)();                        //打印销售信息
  23. }Sales_item, *PSales_item;

  24. int main( void ){
  25.         Sales_item sale;
  26.         sale.Initialize( "Apple", 1.2, 12 );
  27.         sale.Show();
  28.         return 0;
  29. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-15 23:21:50 | 显示全部楼层
我虽然是C语言初学者什么都不懂的菜鸟但是我要对你说:    我   顶  你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 23:24:36 | 显示全部楼层
我自己顶下。求帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-16 10:12:57 | 显示全部楼层
调用函数的对象必须作为参数进行传递,理由如下:
C++中的sale.Initialize( "Apple", 1.2, 12 );实际上将会被编译器翻译为:
Initialize( &sale,"Apple", 1.2, 12 );或者说C++的普通成员函数将会被编译器翻译成普通函数,并为该普通函数增加第一个参数:即 this指针。

因此,要用C模拟C++的行为。成员函数就必须自己加上第一个参数表示this指针。
此外在调用上,能否将sale.Initialize( "Apple", 1.2, 12 );自动转换为Initialize( &sale,"Apple", 1.2, 12 );以目前的C语言似乎不可能。

此外,LZ这里说得兵没有提现出真正的面向对象思想,而仅仅是最简单的类的使用(在这个方面,直接使用C语言的结构体和操纵结构体的函数,和C++并没有多大的差别)。真正困难在于面向对象的多态性的实现,即通过基类指针调用基类虚函数却能够自动调用到子类的虚函数实现。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
编程难 + 5 + 5 + 5 给力

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 10:36:56 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-17 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表