如何用C语言模拟C++语言中的类成员函数
在大家看问题之前,我多说一句这个问题看起来像是语言本身问题,但是实现起来却类似C++编译器实现,所以我就发到这里来了
在C/C++板块上,我的这个问题被人冷嘲热讽,不明白为啥,难道常规想法就不能被打破吗?
如何用C语言模拟C++语言中的类成员函数
例如C++中
class C
{
public:
C() : i(100) {}
int i;
void f() { cout<<i<<endl; }//这里的i就是这个类中的i
};
C c;
c.f();//这个调用会在屏幕上输出100
好, 现在是C语言了
struct T
{
int i
void (*f)();
};
void fun()
{
...
}
T t;
t.i = 100;
t.f = fun;//结构中的指针被初始化
t.f();//这里是通过指针调用函数fun
关键是t.f()这个调用, 我想在进行这个调用的时候, 能够直接访问t.i,
当然,不通过传递指针方式,也就是不能这样fun(&t)
有什么办法没有? 本帖最后由 EricFisher 于 2012-05-16 17:19 编辑
我记得c++编译器的实现思想是为类增加一个this指针域,来指向该类的对象的地址。所以,显式的用C来实现,大体是这样:#include <stdio.h>
typedef struct _T T;
struct _T
{
int i;
void (*f)(T *this);
};
void
fun (T *this)
{
printf ("%d\n", this->i);
}
int
main (void)
{
T t;
t.i = 100;
t.f = fun;
t.f (&t);
}
其中这个this域和成员函数调用中的结构体指针,在C++中可以看作是编译器隐式加入的。 fun (T *this);
我不想这样做, 这样做就失去意义了
主要是我要给别人写接口, 由于T这个类型很复杂, 我只想让使用者使用函数指针,
里面的成员他们根本不关心, 因此, 我就想摸你C++的用法 我的印象就是得用类似fun (T *this);
这也是LINUX内核经常处理的方式,没法用你所提的方式,或者是我所不知的,如果可以也告诉我。。。 显然,不管怎么实现都需要做一些手脚,比如之前说到的编译器在编译的时候隐式增加this指针。
或者,也可以通过宏定义,使得编译器在预处理的时候隐式的增加参数。但是这样实现起来,代码更不好看。可能类似这样,
#define CLASS_T_MEMBER_FUN (obj, fun, args...) obj.fun (&obj, args...)
CLASS_T t;
CLASS_T_MEMBER_FUN (t, f, args...);
实际上, 这个问题, 最后归结到一个问题上: 在fun执行时, 是谁调用了它
也就是要是知道t.f的地址, 就会知道t.i的地址了(参见 linux内核的list_entry)
但是, 在fun执行时, 根本不知道t.f的地址是什么!!!!
唉, 死循环了
页:
[1]