在初入學校開始的第一門專業課就是C語言,當時在教材上說不能在結構體中定義函數,也就沒多想,現在學習了Java/C++的面向對象後,好像絕的結構體就是類的前身,近幾天學校學生組織有招新工作,要用C語言出一點題,有一些知識生疏了,便胡亂去查,便找到了如何在結構體裏放成員函數 的方法,然後去實驗一下,確實可行,便要將其記錄下來。
其實很簡單,只要在結構體裏定義函數指針成員就可以了,但是在用的時候要聲明一下 就如
obj->Method = Method //具體什麼意識我不知道,反正一定要有,就當是個聲明吧
下面定義一個結構體學生,代碼如下
struct Student{
int S_ID;
char *S_Name;
int S_Sex;
void (*showStudentMessage)(struct SStudent*self); //用來顯示成員信息
char* (*getName)(struct Student*self); //用來的來學生姓名
int (*getID)(struct Student*self); //用來得到成員學號
void (*Student__disp__)(struct Student*self); //用來釋放內存空間
};
下面時方法
void showStudentMessage(struct Student*self)
{
printf("學號:%d 姓名:%s 性別:%d \n",self->S_ID,self->S_Name,self->S_Sex);
}
char* getName(struct Student*self)
{
return self->S_Name; //返回姓名
}
int getID(struct Student*self)
{
return self->S_ID; //返回學號
}
void Student__disp__(struct Student*self)
{
delete self;
}
最後要有一個函數來模仿用來初始化的構造函數,
struct Student * Student__init__(int ID,char*Name,int sex)
{
struct Student*temp = (struct Student*)malloc(sizeof(struct Student));
temp->S_ID = ID; //現在這裏面定義一個學生結構體指針並開闢內存
temp->S_Name = Name; //用傳入的參數的值爲變量初始化
temp->S_Sex = sex;
temp->showStudentMessage = showStudentMessage; //聲明這些函數
temp->getName = getName;
temp->getID = getID;
temp->Student__disp__ = Student__disp__;
return temp; //返回這個指針用來創建對象
}
現在這些就先定義好了,寫一個主函數來驗證一下
int main()
{
struct Student*wangtian = Student__init__(1,"萬天",1);
//如果能夠和結構體重名就很像 C++的風格了,只是少了關鍵字new
wangtian->showStudentMessage(wangtian);
//由於不知道怎麼加入關於本對象的this指針,就只能自己給自己當參數了
printf("%d %s ",wangtian->getID(wangtian),wangtian->getName(wangtian));
//看一下方法是否能用
wangtian->Studnet__disp__(wangtian);
//最後把學生對象銷燬
return 0;
}
最後看一下運行的結果
經過這次實驗,我好像看到了編程的發展。