c语言的结构体里面没有函数,但是c++里面有函数,所以今天实现一个c语言面向对象的程序
1、封装
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cmd
{
char *p;
void (*prun)(struct cmd *pcmd);//函数指针
void (*pprint)(struct cmd *pcmd);
}newcmd;
void run(newcmd *pcmd)
{
system(pcmd->p);
}
void print(newcmd *pcmd)
{
printf("%s",pcmd->p);
}
int main()
{
newcmd newcmd1 = {"notepad", run, print};//在定义的时候初始化
newcmd1.pprint(&newcmd1);
newcmd1.prun(&newcmd1);
return 0;
}
注意:1)、函数指针,指向函数代码段的指针,传递相应函数地址,即可调用
2)、结构体初始化时,可以在定义的时候直接初始化,但是允许在定义后再初始化,例如:
newcmd newcmd1;
newcmd1 = {"notepad", run, print};
程序就会报错
但是每个成员可以单独初始化:
newcmd1.p = "notepad";
newcmd1.prun = run;
newcmd1.pprint = print;
2、继承
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cmd
{
char *p;
void (*prun)(struct cmd *pcmd);
void (*pprint)(struct cmd *pcmd);
}CMD;
typedef struct newcmd
{
CMD cmd1;//继承
int (*plength)(struct newcmd *pnewcmd);
}Newcmd;
int getlength(Newcmd *pNewcmd)
{
return strlen(pNewcmd->cmd1.p);
}
void run(CMD *pcmd)
{
system(pcmd->p);
}
void print(CMD *pcmd)
{
printf("%s",pcmd->p);
}
int main()
{
Newcmd newcmd1;
newcmd1.cmd1.p = "calc";
newcmd1.cmd1.pprint = print;
newcmd1.cmd1.prun = run;
newcmd1.plength = getlength;
print(&newcmd1.cmd1);
run(&newcmd1.cmd1);
printf("%d\n",getlength(&newcmd1));
return 0;
}