引言
以前用C++BUILDER 写类非常爽.
类把涉及数据相关的操作打包成一个类.
然后后期开发工程师可以继承啊, 这样提升了开发效率.
不过C语言注重的是执行效率, 类的继承会导致内存的浪费,可能导致性能不佳!
最近继续完善我那个小C,大家还记得小C妹子吗?
操空MYSQL的C程序
对她 就是操空MYSQL的C程序, 我叫她去干删除日志表的工作!
不过最近要对她增加适应工作环境,有的环境需要CA证书,比如说RDS,亚马逊,以及MYSQL自己的证书.
所以对原本的参数需要增加3项. 另外的就是原本参数使用的是数组,无法动态根据实际参数大小来存储.有时候浪费很多内存,有的时候数组不会存储结尾字符'\0' 比如说参数 char is_ssl[3]; 如何是no则没有问题,YES倒是有问题.丢失了结尾符号.在后面比较的时候就无法判断了.
- #include?<stdio.h>
- #include?<stdlib.h>
- #include?<string.h>
- #include?<malloc.h>
-
- #define?KEYSIZE?15
-
- typedef?struct?
- {
- ?union?{
- ??struct?{????
- ????????????char*?ip;
- ????????????char*?user;
- ????????????char*?port;
- ????????????char*?passwd;
- ????????????char*?schema;
- ????????????char*?table_name;
- ????????????char*?limit_rows;
- ????????????char*?total_sql;
- ????????????char*?del_sql;
- ????????????char*?logfile;
- ????????????char*?is_ssl;
- ????????????char*?client_cert;
- ????????????char*?client_key;
- ????????????char*?ca_cert;
- ????????????char*?is_debug;?
- ????????????}??;
- ???char?*pArr[KEYSIZE];
- ?};?????????????
- }?Parameter;
-
- typedef?struct
- {
- ??Parameter?param;
- ??void?(*init)?(Parameter*?param?);
- ??void?(*free)?(Parameter*?param?);
- }TParameter;
-
- //---------------------------------------------------------------------------------------------------------------------
-
- void?init_Paramter(Parameter*?param?)
- {
- ??for(int?i=0;i<KEYSIZE;?i++)
- ?{
- ????param->pArr[i]=NULL;
- ?}
- }???
-
- //---------------------------------------------------------------------------------------------------------------------
- void?free_Parameter(Parameter*?param?)
- {
- ?for?(int?i=0;i<KEYSIZE;i++)
- ?{
- ????free?(param->pArr[i]);
- ????param->pArr[i]=NULL;
- ?}
- }
-
-
- int?main()
- {
- ??TParameter?ParamObj;
- ??ParamObj.init=init_Paramter;
- ??ParamObj.free=free_Parameter;?
- ??ParamObj.init(&ParamObj.param);
-
- ??ParamObj.param.ip=?calloc(sizeof(char),strlen("192.168.0.155")+1);
- ??strcpy(ParamObj.param.ip,"192.168.0.155");
- ??
- ??printf("ParamObj.IP:%s\n",ParamObj.param.ip);
- ??printf("ParamObj.IP?Length:%d\n",strlen(ParamObj.param.ip));
- ??ParamObj.free(&ParamObj.param);
- ????return?0;
- }
定义个 联合体+结构体 类型 Parameter
该类型 里面有个联合体 字符指针数组 ; 外加一个结构体参数;
数组的作用就是遍历结构体里面的指针, 从而可以初始化和释放内存操作
然后我们再套个结构体类型. 把 Parameter 设置成了数据成员,
另外我们再定义两个函数指针成员.
这样我们的类就定义完成了.
接着我们在主函数里面 定义类的 参数对象
TParameter ParamObj;
这里是C 不像C++ 我们需要手工关联 函数指针成员. 说白点就是给它赋值
关联上具体函数地址.
ParamObj.init=init_Paramter;
ParamObj.free=free_Parameter;
接着我们通过函数来初始化我们的参数数据
ParamObj.init(&ParamObj.param);
然后就是我们正式的对数据成员动态分配堆内存
ParamObj.param.ip= calloc(sizeof(char),strlen("192.168.0.155")+1);
strcpy(ParamObj.param.ip,"192.168.0.155");
接下来就是 对数据成员的使用
printf("ParamObj.IP:%s\n",ParamObj.param.ip);
printf("ParamObj.IP Length:%d\n",strlen(ParamObj.param.ip));
最后我们释放数据成员的内存
ParamObj.free(&ParamObj.param);
我们一般都定义为址传给函数; 因为这样非常快; 传内存地址 也就是4-8字节
而传值 就大于8字节;
strlen(ParamObj.param.ip) 就13个字节!
C语言菜单
C语言的野指针
VSCODE 从相恋到分手
以上就是C语言如何写类实现教程示例的详细内容,更多关于C语言如何写类的资料请关注w3xue其它相关文章!