IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Ex_DirectUI 4.1 C++重写 - 2 可扩展数组 -> 正文阅读

[C++知识库]Ex_DirectUI 4.1 C++重写 - 2 可扩展数组

可扩展数组位于YHan.Helper中。
可扩展数组与C数组区别较大,具有以下特点
1.动态扩容,这一点与std::vector比较像
2.支持添加、删除、读值、写值时,触发对应的事件回调
3.带排序功能,支持自定义元素比较函数
4.合法性验证(IsBadReadPtr验证array对象的合法性,IsBadCodePtr验证callback的合法性)

在重写的过程中,发现作者很喜欢防御式编程,第4点就是很好体现,但是我认为对于非法输入应该使用assert,因为这是代码写错了,强行让代码继续运行本就是逻辑错误,直接让程序崩掉才是正确选择。

明白了作者的设计意图后,我们很好给出C语言的对于可扩展数组的定义。因为可扩展数组并不是Ex_DirectUI导出的功能,所以我们也没必要保证abi与原作者的实现相同,只需要包含所需功能即可,另外原作者的实现可以禁用事件,但是Ex_DirectUI中没有用到,我就不去实现了。

#ifndef _EX_DIRECTUI_ARRAY_H_
#define _EX_DIRECTUI_ARRAY_H_
#include <stddef.h>

#define EX_DIRECTUI_ARRAY_DEFAULT_GROWTH 1.1f

//声明为不完整类型
typedef struct tag_array_t array_t;

enum array_event_t
{
	array_event_add,
	array_event_del,
	array_event_get,
	array_event_set,
	array_event_cmp
};

enum array_reason_t
{
	array_reason_find,
	array_reason_sort
};

typedef void * array_element_t;

typedef void *(*array_add_cb_t)(
	array_t * arr,
	size_t idx,
	array_element_t ele,
	void * param);

typedef void(*array_del_cb_t)(
	array_t * arr,
	size_t idx,
	array_element_t ele,
	void * event_data);

typedef void *(*array_get_cb_t)(
	array_t * arr,
	size_t idx,
	array_element_t ele,
	void * event_data);

typedef void *(*array_set_cb_t)(
	array_t * arr,
	size_t idx,
	array_element_t ele,
	void * event_data);

typedef int(*array_cmp_cb_t)(
	array_t * arr,
	size_t idx_x,
	array_element_t ele_x,
	size_t idx_y,
	array_element_t ele_y,
	void * event_data,
	array_reason_t reason);

typedef struct tag_array_t
{
	array_element_t * data;
	size_t size;
	size_t capacity;
	float growth;
	void * user_data;
	void * event_data;
	array_add_cb_t add_cb;
	array_del_cb_t del_cb;
	array_get_cb_t get_cb;
	array_set_cb_t set_cb;
	array_cmp_cb_t cmp_cb;
}array_t;

#endif

总的来说,我认为原作者的可扩展数组有点设计错误的地方,例如:数组_创建 函数中,传递参数初始成员数,但又无法触发添加成员的事件回调,数组重定义时,若缩小容量,会调用数组事件_删除成员,凭什么扩容时,不调用数组事件_添加成员呢?但我也只能读懂原作者的代码,才能重新设计数组容器。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:05:37  更:2021-12-15 18:06:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:06:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码