Struct结构体高级用法总结(c/c++混合使用)

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的源码或别的文档源码中的常用手法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值