如何用C语言模拟动态联编?
在这里用一个示例表示。
设计一个方法来输出方形和圆形的面积。
- 前言
- 原理
- 函数指针
- 表示形状的结构体
- 表示方形和圆形的结构体
- 计算面积的函数
- 运行示例
原理:
设计一个函数指针,一个代表形状的结构体,一个方形结构体和圆形结构体;两个分别计算其面积的函数。
将对应的函数赋值给对应的函数指针,再利用形状指针分别指向方形和圆形结构体类型的地址,就可实现动态联编。
。
。
。
首要条件是一个函数指针:
typedef struct _Ops
{
float (*area)(void*);
}Ops;
表示形状的结构体
再设计一个代表形状的结构体:
typedef struct _Shape
{
Ops ops;
}Shape;
表示方形和圆形的结构体
表示方形和圆形的结构体:
typedef struct _Square
{
Shape shape;
float length;
}Square;
typedef struct _Circle
{
Shape shape;
float radius;
}Circle;
计算面积的函数
计算面积的函数:
float square_area(void* thiz)
{
if (thiz == NULL) return -1;
printf("Square area:\n");
Square* sp = (Square*)thiz;
float area = sp->length * sp->length;
return area;
}
const float PI = 3.14;
float circle_area(void* thiz)
{
if (thiz == NULL) return -1;
printf("Circle area:\n");
Circle* sp = (Circle*)thiz;
float area = sp->radius * sp->radius * PI;
return area;
}
运行示例
编写运行时代码:
int main(void)
{
Square square;
memset(&square, 0, sizeof(Square));
square.length = 10;
square.shape.ops.area = square_area;
Circle circle;
memset(&circle, 0, sizeof(Circle));
circle.radius = 10;
circle.shape.ops.area = circle_area;
Shape* shape = NULL;
shape = (Shape*)□
cout << shape->ops.area(&square) << endl;
shape = (Shape*)&circle;
cout << shape->ops.area(&circle) << endl;
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)