数据容器与属性容器 巧妙关联示例

CoordinateListNode“数据容器与属性容器” 的分层关联关系ListNode 作为 “上层图形属性管理者”,通过指针持有 Coordinate(“下层坐标数据载体”),两者配合实现 “图形属性 + 坐标数据” 的完整存储,专门适配激光标记等需要精准关联 “图形类型” 与 “位置信息” 的场景。

一、核心关系:ListNode 持有 Coordinate 的指针(聚合关系)

两个结构体的关联核心在 ListNode 的成员变量 struct Coordinate* data—— 这是一个指向 Coordinate 结构体的指针,意味着:

  • ListNode 不直接 “包含”Coordinate 的所有成员(不是把 Coordinate 直接嵌入 ListNode),而是通过指针 “引用”Coordinate 实例;
  • 一个 ListNode 可以对应 一个 Coordinate 实例(最常见,如一个矩形图形对应一组对角坐标);
  • 理论上也可对应多个 Coordinate 实例(通过 Coordinateprev/next 形成链表,如一个多边形对应多个顶点坐标对)。

二、关系的具体体现(分工明确)

两者的角色完全分离,分别负责 “图形属性” 和 “坐标数据”,避免数据混杂,方便维护和扩展:

结构体核心角色存储内容(职责边界)
Coordinate坐标数据载体纯位置信息:- x/y/x2/y2:点或点对的坐标(如起点 / 终点、对角点)- prev/next:串联多个坐标(形成坐标链表)
ListNode图形属性管理者图形的非位置属性:- type:图形类型(如 1 = 点、5 = 矩形,决定业务逻辑)- width/height:矩形尺寸- radius:圆半径- angle/radian:旋转角度- data:关联对应的坐标数据(绑定属性与位置)

三、实际业务中的配合逻辑(结合你的激光场景)

以你之前的激光标记代码为例,两者的协作流程非常清晰:

  1. 当需要标记一个 “矩形” 时:

    • 先创建 ListNode 实例:设置 type=5(标记为矩形)、width=10(矩形宽)、height=5(矩形高);
    • 再创建 Coordinate 实例:设置 x=50,y=80(矩形左上角)、x2=150,y2=30(矩形右下角);
    • 通过 ListNode->data = Coordinate实例的指针,将 “矩形属性” 与 “矩形坐标” 绑定。
  2. 遍历 ListNode 链表生成激光指令时:

    • 先判断 ListNode->type=5(确定是矩形),从而执行矩形标记逻辑;
    • 再通过 ListNode->data 拿到 Coordinate 实例,读取 x/y/x2/y2 坐标,生成矩形路径。

四、关键特性(为什么要这样设计?)

这种 “指针关联” 的设计比 “直接嵌入” 更灵活,核心优势有两点:

  1. 解耦属性与数据:若需要修改坐标(如调整矩形位置),只需改 Coordinate 实例,无需动 ListNode 的属性;若需要修改图形尺寸,只需改 ListNodewidth/height,无需动坐标。
  2. 支持复杂图形:若需要标记 “多边形”(多个顶点),只需通过 Coordinateprev/next 串联多个坐标对,再用一个 ListNode 关联这个坐标链表(data 指向坐标链表的头节点),无需定义新的结构体。

五、内存管理注意事项(关联带来的约束)

由于 ListNode 通过指针关联 Coordinate,删除 ListNode 时必须同步处理 Coordinate 的内存,否则会导致内存泄漏:

cpp

运行

// 正确的删除逻辑:先删 Coordinate,再删 ListNode
void deleteListNode(ListNode* node) {
    if (node->data != nullptr) {
        // 若 Coordinate 是链表,需先遍历删除所有 Coordinate 节点
        Coordinate* coord = node->data;
        while (coord != nullptr) {
            Coordinate* temp = coord;
            coord = coord->next;
            delete temp;
        }
    }
    delete node; // 最后删 ListNode
}

总结:ListNodeCoordinate 是 “1 对 N”(1 个图形属性对应 N 个坐标数据)的聚合关系,前者管 “是什么图形”,后者管 “图形在哪里”,共同支撑激光标记等需要 “属性 + 位置” 精准绑定的业务场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值