时间:2020-09-19 11:26:26 来源:信盈达 作者:
函数Ixx为类xx的构造函数的实现。 原类的成员函数改为前缀为结构体名+‘_’的函数。 函数指针U为原类的析构函数的声明; U+结构体名称为原类的析构函数的实现; Fun-_+结构体名为对该结构体成员函数指针进行指向; 以后遇到上述情况将不再说明。
1)对于类的数据成员可以直接转为C中结构体的数据成员。
2)函数则需转化为对应的函数指针,因为struct里不允许出现函数的声明和定义。而函数前如果有virture,inline等修饰符也要去掉,如函数void funca(int a);改为void (*funca)(struct B *p,int a);大家可以看到函数指针的原型里加了一个指针struct B的指针,这是因为要在函数内部对类的成员进行操作,要靠该指针指定结构体的成员。在类的成员函数里,实际上在参数列里也隐含有一个指向自身的this指针。
3)对于静态成员则要定义成全局变量或全局函数,因为结构体中不能有静态成员。
class A { public: A(); ~A(); void func(int a); private: int b; }; A::A() { b=0; } void A::func(int a) { b=a; } typedef struct classA A; struct classA { void (*A)(struct classA *p);//构造函数指针 void (*U)(struct classA *p);//析构函数指针 void (*func)(struct classA *p,int a); int b; }; void fun_A(A *p) { p->func=classA_func; //将函数指针初始化 } void IA(A *p) //构造函数,命名规则在类名前加I { fun_A(p); p->b=0; //原构造函数所作部分 } void classA_func(A *p,int a) { p->b=a; }
A *s=(A*)malloc(sizeof(A)); s->A=IA; s->A(s);
如果将子类指针赋给基类指针,基类指针在释放的时候不必考虑调用哪个函数名的析构函数,只需调用成员函数U即可。
成员函数U需要像一般成员函数一样在fun_类名()函数中指定。类的析构函数是由系统调用的,在C中则要显式调用。至于何时调用,要准确判断。
作为参数传给函数。(additem(Itema))
作为函数返回值。
实例化类时作参数。
class B { … virture void funb(); inline int add()const {return a+b;}; private: int a; int b; … }
typedef classB B; struct classB { … void (*funb)(struct classB *p); int (*add)(struct classB *p); int a; int b; } void classB_funb(B *p) { … } int classB_add(B *p) { return p->a+p->b; } void fun_classB(B *p) { … p->funb=classB_funb; p->add= classB_add; }
免费领取试听卡
申请已经提交
老师会马上给您安排试听课程!
申请出错了
您可以加老师QQ:914865590报名咨询!