#include <iostream>
#include <string.h>
using namespace std;
struct stud//学生信息结构体
{
char name[10];
int num;
int (* set_info)(char *, int*);//设置学生信息,一般使用回调函数
void (* print_info)(char *, int);//打印学生信息,一般使用回调函数
};
int setinfo(char *name, int *num)//此函数结构体中普通变量赋值
{
strcpy(name, "zhang_san");
*num = 1001;
return 0;
}
void printinfo(char *name, int num)//打印结构体重普通变量
{
cout << "name :" << name << endl;
cout << "num :" << num << endl;
}
class Time //时间信息类
{
public :
Time(int = 10, int = 10, int = 10);//构造函数
~Time(); //析构函数
int set_time(int ,int, int); //普通函数
void print_time(); //普通函数
private: //普通数据设置为私有
int hour;
int minute;
int sec;
};
Time:: Time(int h, int m, int s)//定义构造函数
{
hour = h;
sec = s;
minute = m;
}
Time:: ~Time() //定义析构函数(注意析构函数不能带参数)
{
cout << "Will end time!
";
cout << hour << ":" << minute << ":" << sec << endl;
}
int Time::set_time(int h, int s, int m)//定义设置时间函数
{
hour = h, sec = s, minute = m;
return 0;
}
void Time:: print_time() //定义打印时间函数
{
cout << hour << ":" << minute << ":" << sec << endl;
}
int main()
{
//结构体操作
struct stud student;
student.set_info = setinfo;//或者直接赋值setinfo
//student.set_info(student.name, &student.num);
(*student.set_info)(student.name, &student.num);
student.print_info = &printinfo;
(*student.print_info)(student.name, student.num);
//student.print_info(student.name, student.num);//也是正确的
//类的操作
Time t;
class Time *ctime = &t;
(ctime->print_time)();
int (Time:: *p)(int ,int ,int);
p = &Time::set_time; //只能如此赋值
(ctime->*p)(20, 45, 35);
void (Time:: *print)();
print = &Time::print_time; //只能如此赋值
(ctime->*print)(); //只能如此使用
//综上可知: 在类中若使用回调函数(即函数指针)则只能p = &Time::set_time;
//若调用此回调函数只能(ctime->*p)(?, ?, ?);其他都是非法的
//而在结构体中继承的C语言特性,对函数操作函数名与函数取地址几乎等价的
return 0;
}