编程论坛's Archiver

ioriliao 发表于 2008-6-17 14:26

为结构添加方法

[code]
#include <stdio.h>
typedef void (*printDel)();
typedef struct point
{
     int x;
     printDel print;      
}point;
void print(point*);
point* new_point();

point* new_point()
{
     point* tmp=(point*)malloc(sizeof(point));
     tmp->print=print;
     return tmp;
}
void print(point* tmp)
{
     printf("%d",tmp->x);
}

int main(void)
{
    point* xy=new_point();
    xy->x=10;
    xy->print(xy);
    free(xy);
    getch();
    return 0;   
}


[/code]
想实现如此的:xy->print()不知有解决之道否?

leeco 发表于 2008-6-17 14:54

我没办法解决this指针的传递问题

[[it] 本帖最后由 leeco 于 2008-6-17 14:57 编辑 [/it]]

ioriliao 发表于 2008-6-17 14:57

呵呵...我知道C从语言特性方面不是面向对象的...
只是我突发奇想,试探在C实现面向对象.

ioriliao 发表于 2008-6-18 08:02

大家来研究研究么.

StarWing83 发表于 2008-6-20 16:33

有本书,叫《在C中实现面向对象》,论坛某达人发过,你搜搜看?

flyue 发表于 2008-6-20 16:44

呵呵,那还不如用C++来得直接,又何苦用C来实现C++的class的功能呢?
不过如果是想研究研究,倒还是支持的。哪天有时间我也来玩玩。

ioriliao 发表于 2008-6-20 16:45

呵呵...就是想研究研究的...
各位仁兄们最好能来共同研究研究,呵呵...

StarWing83 发表于 2008-6-20 16:50

如果真的想研究,就不要拘泥语法了。
C++的“为类添加方法”其实就是多传了一个this。直接在函数里面传一个this就可以了。
void class_method(...,class* this);
从原理上把握,而不是从语法上。
对于上面的函数,可以写个宏,这样就不用显式传递this了,具体应该很简单,就不写了。

flyue 发表于 2008-6-20 16:54

只是,如果用LZ这种方法来模拟class,那VC的“代码自动提示功能”就没用了。
在VC里,当输入函数“(”后VC会自动列出其函数参数,可是LZ这种方法就不会列出了

StarWing83 发表于 2008-6-20 16:58

注意这种功能不是“面向对象”的一部分,也不会是“面向对象”的优点。
转一篇文:
  即便是在C语言中,add函数被多数C编译器编译后在符号库中的名字也不是add,而是_add。而在C++编译器中,int add(int x,int y)会编译成类似_add_int_int这样的名字(称为“mangled name”),float add(float x,float y)则被编译成_add_float _float,mangled name包含了函数名、函数参数数量及类型信息,C++依靠这种机制来实现函数重载。

  所以,在C++中,本质上int add( int x, int y )与float add( float x, float y )是两个完全不同的函数,只是在用户看来其同名而已。

  这就要求初学者们能透过语法现象看问题本质。本质上,语言的创造者们就是在玩各种各样的花样,以使语言具备某种能力,譬如mangled name花样的目的在于使C++支持重载。而C语言没有玩这样的花样,所以int add( int x, int y )与float add( float x, float y )不能在C程序中同时存在。

StarWing83 发表于 2008-6-20 16:59

所以你可以使用一些技巧来模拟mangled name的

sunkaidong 发表于 2008-6-20 17:00

用一个指向函数的指针放在函数里面可以实现

VxWorks 发表于 2008-6-20 17:03

找个C++的编译器,看看C++编译器是怎么实现的不就知道了吗

中学者 发表于 2008-6-20 17:04

C模拟C++,貌似就是接口规则....语法不像,但是就那么回事...

StarWing83 发表于 2008-6-20 17:06

恩。
还有,C++的this通过ecx传递,速度上比C模拟的快。
C++和C各有所长,何必去模拟呢?

ioriliao 发表于 2008-6-20 17:37

我当且紧当关心的是实现的技巧,而不关心其实现有什么价值,它价值之所在否,那是另一个讨论范畴了..
太多题外之言没用...

无语雨季 发表于 2008-6-20 18:10

[quote][bo][un]ioriliao[/un] 在 2008-6-17 14:26 的发言:[/bo]


#include
typedef void (*printDel)();
typedef struct point
{
     int x;
     printDel print;      
}point;
void print(point*);
point* new_point();

point* new_point()
{
     point* tmp= ... [/quote]
这位兄弟真的很不错,很喜欢研究,也不说一些空洞的话,写代码就是做实事,就算简单,比耍嘴皮子要好,支持你呵呵
不过我认为你开辟内存空间是多余的。这样就可以的
#include <stdio.h>
typedef void (*printDel)();
typedef struct
{
     int x;
     printDel print;
}point;
void print(point*);
point* new_point();

point* new_point()
{
     point* tmp=NULL;
     tmp->print=print;
     return tmp;
}
void print(point* tmp)
{
     printf("%d\n",tmp->x);
}

int main(void)
{
    point* xy=new_point();
    xy->x=10;
    xy->print(xy);
    getch();
    return 0;
}

中学者 发表于 2008-6-20 18:17

xy->print(xy);
既不是方法调用的形式,也不是扩展语义的形式..

ioriliao 发表于 2008-6-20 18:19

谢谢17楼仁兄改之...

StarWing83 发表于 2008-6-20 18:56

C没有重载,就不要画虎类猫了吧?

页: [1] 2

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.