1.Struct中可以有构造函数
下面展示一些结构体使用构造函数的例子。
struct node{
//构造函数
node()//形参表
{
//内容
}
};
具体node结构体构造函数例子 :
struct node{
node(int c):x(0),y(c){}//注意这对象征性地大括号不能丢
int x,y;
};
/*
node:这是类的名称,表示这是一个构造函数。
int c:这是构造函数的参数列表,表示构造函数接受一个整数参数 c
:初始化列表的开始标志。
x(0):表示将成员变量 x 初始化为 0。
y(c):表示将成员变量 y 初始化为传入的参数 c。
*/
2.Struct中可以模拟c++继承机制
/* 基类 */
struct buffer {
int size;
void (*validate)(struct buffer *buf);
};
/* 子类 */
struct texture_buffer {
struct buffer base; /* 基类,必须放在最前面! */
int format;
int width, height;
};
可以定义一个创建 texture_buffer 对象的函数:
struct buffer *create_texture_buffer(int w, int h, int format) {
struct texture_buffer *t = malloc(sizeof(*t));
t->format = format;
t->width = w;
t->height = h;
t->base.size = w * h;
t->base.validate = tex_validate;
return &t->base;
}
其中,tex_validate 是一个具体的验证函数:
void tex_validate(struct buffer *buf) {
struct texture_buffer *tb = texture_buffer(buf);
assert(tb->format);
assert(tb->width);
assert(tb->height);
}
使用示例:
int main() {
struct buffer *buf = create_texture_buffer(1024, 768, 32);
struct texture_buffer *tex_buf = texture_buffer(buf);
// 现在可以使用 tex_buf 访问 texture_buffer 的成员
int width = tex_buf->width;
int height = tex_buf->height;
int format = tex_buf->format;
// 调用 validate 函数
buf->validate(buf);
free(buf); // 释放内存
return 0;
}
通过将基类结构体作为派生类结构体的第一个成员,可以在 C 语言中实现多态性和代码复用。这种技术不仅提高了代码的灵活性和可维护性,还确保了类型转换的安全性。这在Mesa3d的源码或别的文档源码中的常用手法。