讨论一下用C语言模拟面向对象

Flood1984 2005-12-09 04:36:57
这两天在琢磨用C语言模拟面向对象问题。
觉得这个方面应该需要实现以下功能:
1.同一个类可以有多个对象;
2.支持类成员和类成员函数,使每个对象都能访问到自己的数据成员,但共享成员函数;
3.成员函数被调用时能正确的访到当前对象的数据成员;
4.支持继承。

先说说我的做法,以抛砖引玉:
如果不考虑访问权限的话,
struct中的变量就是class中的成员;
struct中加入函数指针可以当成成员函数;
定义一个实例就是一个类对象了,这可以保证同一个类有多个对象;
在新类中加一个父类struct类型的成员就能模拟继承。
就是第三点觉得很棘手,因为函数无法得到当前对象的数据成员,
比如:
struct Button {
int x ; int y ;
void (*Draw)();
void (*Erase)();
} A , B;
那么如果我写成:
A.Draw();// Draw无法确定被那个对象调用。
我用了一个死办法,就是给每个成员函都多加一个指向自己的指针:
void (*Draw)(struct Button*);
A.Draw(&A); //这样看得很不爽,写得也不爽

各位怎么看这个问题,怎么改进?
...全文
201 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cunsh 2005-12-10
  • 打赏
  • 举报
回复
那样写还不如把draw指针弄成静态的成员.
把a要写到.前面也没必要吧.
Flood1984 2005-12-10
  • 打赏
  • 举报
回复
cunsh(校友录怎么写?求求大家了?)
那样写还不如把draw指针弄成静态的成员.
------------------------------------
不错的建议,静态的不会出现赋值。
只是我记得C的struct中好象不能有static.
Flood1984 2005-12-10
  • 打赏
  • 举报
回复
我现在做界面用的是一种叫WeckBench的代码生成器。
操作的时候思想是OOP,就是象BCB那样往对话框上拖控件。
但是其生成的代码却是满足ANSI C标准的。(生成的代码用别的编译器编译)
本来想拿它生成的代码来学习的,却发现其重要部分用lib封装起来了,
所以才来这请教各位。
goodluckyxl 2005-12-10
  • 打赏
  • 举报
回复
楼主是c和c++的基本概念没搞清楚
c++中类成员函数传递如何运行的
编译器如何工作的 一点概念都没有
#include <stdio.h>
#define OFFSET(STRUCT,MEMBER) ((int)(&(((STRUCT*)0)->MEMBER)))

struct Button
{
int x ;
int y ;
void (*Draw)(void*);
void* this ;
};

void Draw(void* this)
{
printf("A.x=%d A.y=%d",((struct Button*)this)->x,((struct Button*)this)->y) ;
}


int main()
{
struct Button A;
//construct act
A.this = (int)&A.this - OFFSET(struct Button,this) ;
((struct Button*)A.this)->x = 1;
((struct Button*)A.this)->y = 2;
((struct Button*)A.this)->Draw= Draw;

// there will be a this pointer as m-f param
A.Draw(A.this);
}
visual4825 2005-12-09
  • 打赏
  • 举报
回复
挂羊皮 卖狗肉 怎么可以
fiftymetre 2005-12-09
  • 打赏
  • 举报
回复
C还是做好自己份内的事吧

拿狗根田的事,有什么意义呢?
我是没什么研究的,下面的牛人回答吧


关注中。。
pahuihui 2005-12-09
  • 打赏
  • 举报
回复
CPP优雅是因为语言的层面上做了许多事情。。


zez 2005-12-09
  • 打赏
  • 举报
回复
参考 <<用c实现oop.PDF>>

呵呵,不过我没研究过..

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧