C語言如何寫類實(shí)現(xiàn)教程示例
引言
以前用C++BUILDER 寫類非常爽.
類把涉及數(shù)據(jù)相關(guān)的操作打包成一個(gè)類.
然后后期開發(fā)工程師可以繼承啊, 這樣提升了開發(fā)效率.
不過C語言注重的是執(zhí)行效率, 類的繼承會導(dǎo)致內(nèi)存的浪費(fèi),可能導(dǎo)致性能不佳!
最近繼續(xù)完善我那個(gè)小C,大家還記得小C妹子嗎?
操空MYSQL的C程序
對她 就是操空MYSQL的C程序, 我叫她去干刪除日志表的工作!
不過最近要對她增加適應(yīng)工作環(huán)境,有的環(huán)境需要CA證書,比如說RDS,亞馬遜,以及MYSQL自己的證書.
所以對原本的參數(shù)需要增加3項(xiàng). 另外的就是原本參數(shù)使用的是數(shù)組,無法動(dòng)態(tài)根據(jù)實(shí)際參數(shù)大小來存儲.有時(shí)候浪費(fèi)很多內(nèi)存,有的時(shí)候數(shù)組不會存儲結(jié)尾字符'\0' 比如說參數(shù) char is_ssl[3]; 如何是no則沒有問題,YES倒是有問題.丟失了結(jié)尾符號.在后面比較的時(shí)候就無法判斷了.
#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;
}定義個(gè) 聯(lián)合體+結(jié)構(gòu)體 類型 Parameter
該類型 里面有個(gè)聯(lián)合體 字符指針數(shù)組 ; 外加一個(gè)結(jié)構(gòu)體參數(shù);
數(shù)組的作用就是遍歷結(jié)構(gòu)體里面的指針, 從而可以初始化和釋放內(nèi)存操作
然后我們再套個(gè)結(jié)構(gòu)體類型. 把 Parameter 設(shè)置成了數(shù)據(jù)成員,
另外我們再定義兩個(gè)函數(shù)指針成員.
這樣我們的類就定義完成了.
接著我們在主函數(shù)里面 定義類的 參數(shù)對象
TParameter ParamObj;
這里是C 不像C++ 我們需要手工關(guān)聯(lián) 函數(shù)指針成員. 說白點(diǎn)就是給它賦值
關(guān)聯(lián)上具體函數(shù)地址.
ParamObj.init=init_Paramter;
ParamObj.free=free_Parameter;
接著我們通過函數(shù)來初始化我們的參數(shù)數(shù)據(jù)
ParamObj.init(&ParamObj.param);
然后就是我們正式的對數(shù)據(jù)成員動(dòng)態(tài)分配堆內(nèi)存
ParamObj.param.ip= calloc(sizeof(char),strlen("192.168.0.155")+1);
strcpy(ParamObj.param.ip,"192.168.0.155");
接下來就是 對數(shù)據(jù)成員的使用
printf("ParamObj.IP:%s\n",ParamObj.param.ip);
printf("ParamObj.IP Length:%d\n",strlen(ParamObj.param.ip));
最后我們釋放數(shù)據(jù)成員的內(nèi)存
ParamObj.free(&ParamObj.param);
我們一般都定義為址傳給函數(shù); 因?yàn)檫@樣非??? 傳內(nèi)存地址 也就是4-8字節(jié)
而傳值 就大于8字節(jié);
strlen(ParamObj.param.ip) 就13個(gè)字節(jié)!
以上就是C語言如何寫類實(shí)現(xiàn)教程示例的詳細(xì)內(nèi)容,更多關(guān)于C語言如何寫類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下2017-10-10

