在結構體中添加方法以模仿類的效果

在初入學校開始的第一門專業課就是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;
} 

最後看一下運行的結果
效果如下
經過這次實驗,我好像看到了編程的發展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章