如何把C++的源程序改写成C语言
Posted 信盈达分享汇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把C++的源程序改写成C语言相关的知识,希望对你有一定的参考价值。
函数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; }
类之间的继承关系是复杂且多变的,为了保证基类在所有子类中的唯一而且方便修改,最好的方法就是把基类的结构体部分做成宏,在子类中直接使用即可。
多继承也是可以改的,将多个基类的成员全部拷到子类里,遇到重复的成员名,则在前面加上前缀来区别,当然这个指的是基类之间有相同的,如果是派生类和基类之间有重名的,则会覆盖基类。
相关咨询 : 客服微信:13316957201,咨询课程、就业、薪资等相关问题。
以上是关于如何把C++的源程序改写成C语言的主要内容,如果未能解决你的问题,请参考以下文章