@@ -108,7 +108,7 @@ updated: 2024-05-01 10:10:00
108108
109109 - 用一张图理解
110110
111- <img src="https://img-blog.csdnimg .cn/direct/f9332ae3aee845c0b4306bed0d62f669 .png" alt="image-20240130141713776" style="zoom:75%;" />
111+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240130141713776 .png" alt="image-20240130141713776" style="zoom:75%;" />
112112
113113
114114 - 优点:能够做到很好的内存释放,我们确定的父对象,当父对象释放的时候,子对象也必须跟着释放,例如`LWindow`没了,那`LButton`肯定也没了,对象树的功能就是父对象在释放的时候,会首先和他的父对象断开联系,然后释放以自己为根的这颗多叉树,从最下面的子对象开始依次向上释放,最终释放自身,有点`Java`的`gc`的感觉,如果不做处理的话,尤其是在堆上开辟的空间管理将会非常混乱;同时个人认为在`GUI`编程中用的非常频繁
@@ -138,11 +138,11 @@ updated: 2024-05-01 10:10:00
138138 - 重载`new`运算符,对类重载`new`运算符,在外部调用`new`的时候会优先考虑重载的版本
139139 - 在这里重载之后,将类内部的数据全部填充为`'L'`
140140
141- <img src="https://img-blog.csdnimg .cn/direct/5bd53105965449338f5dfac3e06d8376 .png" alt="image-20240130163612435" style="zoom:75%;" />
141+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240130163612435 .png" alt="image-20240130163612435" style="zoom:75%;" />
142142
143143 - 我们预留了一块内存判断区域,这时候`new`的实际操作顺序是,先调用我们的重载版本的`new`,然后强转为本类指针被接受,然后调用构造函数,因此在构造的时候其他数据段会进行初始化,而内存判断区不会,问题解决
144144
145- <img src="https://img-blog.csdnimg .cn/direct/51f96fa3c32f419989240c71a2f6c11c .png" alt="image-20240130164008701" style="zoom:70%;" />
145+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240130164008701 .png" alt="image-20240130164008701" style="zoom:70%;" />
146146
147147- `RTTI`机制
148148
@@ -209,23 +209,23 @@ updated: 2024-05-01 10:10:00
209209 - 子对象可能也有自己的子对象列表,所以应该按照递归的方式去调用,当本对象没有子对象才做真正的释放,这样感觉合理一些
210210 - `2.21`更新:我看错了,它`delete`的是`pChild`,这样下去就是递归调用,这一条没有问题
211211
212- <img src="https://img-blog.csdnimg .cn/direct/11885be8f8ee4a418754af4af73f0383 .png" alt="image-20240204111431725" style="zoom:75%;" />
212+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240204111431725 .png" alt="image-20240204111431725" style="zoom:75%;" />
213213
214214- 用`LList`替代`std::list`
215215
216216 - `LList`目前并未走查,也并未针对可能存在的问题修改或重构,代码健壮程度不如`LVector`,但是选用`LVector`的话由于二者接口名称的不同,可能需要改动的工作量较大
217217
218- <img src="https://img-blog.csdnimg .cn/direct/d46d3523e8954523aa83ff550b93bb0a .png" alt="image-20240130145951498" style="zoom:80%;" />
218+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240130145951498 .png" alt="image-20240130145951498" style="zoom:80%;" />
219219
220- <img src="https://img-blog.csdnimg .cn/direct/4ec783ae9ab844fea2bfdf3a35681a1f .png" alt="image-20240130150016313" style="zoom:80%;" />
220+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240130150016313 .png" alt="image-20240130150016313" style="zoom:80%;" />
221221
222222- `RTTI`机制
223223
224224 - 我能想到的就是`typeinfo().name()`,它的返回值是有一定规律的,当然我们这里是用作自定义类类名的存储,做一个算法解析,然后在构造函数的时候调用即可
225225
226226 - 具体见上面"学习的点"
227227
228- <img src="https://img-blog.csdnimg .cn/direct/99913101ecc344f4bcf94186e27cb96c .png" alt="image-20240130165250475" style="zoom:77%;" />
228+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240130165250475 .png" alt="image-20240130165250475" style="zoom:77%;" />
229229
230230#### 动态属性功能
231231
@@ -235,7 +235,7 @@ updated: 2024-05-01 10:10:00
235235
236236 - 最核心的功能:为类内的成员属性很方便的设置一个`getter`和`setter`方法,当然还有一些其他的附加方法
237237
238- <img src="https://img-blog.csdnimg .cn/direct/00dc69c82dd5495f91d42501bfedeafb .png" alt="image-20240130152909683" style="zoom:78%;" />
238+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240130152909683 .png" alt="image-20240130152909683" style="zoom:78%;" />
239239
240240 - 我自己用`Qt`写了一个`demo`做演示
241241
@@ -254,7 +254,7 @@ updated: 2024-05-01 10:10:00
254254
255255- 存储连接到本对象某个槽函数的所有信号列表
256256
257- <img src="https://img-blog.csdnimg .cn/direct/e531aff118874edab705740b80269531 .png" alt="image-20240201142729430" style="zoom:65%;" />
257+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240201142729430 .png" alt="image-20240201142729430" style="zoom:65%;" />
258258
259259- 事件处理接口`event()`,可以处理定时器事件和信号槽事件,我关心信号槽事件,涉及到类`LSignalEvent`,见下面
260260
@@ -318,7 +318,7 @@ updated: 2024-05-01 10:10:00
318318
319319 - 在构造`Application`的时候,构造单例平台相关接口,平台接口返回平台相关的一些信息,也是单例
320320
321- <img src="https://img-blog.csdnimg .cn/direct/367ef6de2c8b44c2a6afdcca56fddd37 .png" alt="image-20240131143154853" style="zoom:75%;" />
321+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240131143154853 .png" alt="image-20240131143154853" style="zoom:75%;" />
322322
323323 - `LPlatformInterface`派生出`LLinuxInterface`和`LWin32Interface`,并且`LPlatformInterface`是一个抽象类,它内部的平台相关功能在派生类覆写,通用功能自己写了,并且它也是一个单例模式,因此派生类也是单例
324324
@@ -370,13 +370,13 @@ updated: 2024-05-01 10:10:00
370370
371371 - 右值引用代表进来的是一个将亡对象,一般写移动的内部实现是将二者的数据区`swap`,这样原来的数据区就会被自动回收,这样可以减少拷贝的次数,所以应该没有`const`
372372
373- <img src="https://img-blog.csdnimg .cn/direct/dfaad54b9e4a45af9578faf4ab2ffd33 .png" alt="image-20240131142031853" style="zoom:71%;" />
373+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240131142031853 .png" alt="image-20240131142031853" style="zoom:71%;" />
374374
375- <img src="https://img-blog.csdnimg .cn/direct/ec38729233b643e898eba10708153b20 .png" alt="image-20240131141725174" style="zoom:70%;" />
375+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240131141725174 .png" alt="image-20240131141725174" style="zoom:70%;" />
376376
377377- 代码中的`TODO`
378378
379- <img src="https://img-blog.csdnimg .cn/direct/f48f49f888ca4bfd986142f2c7012a67 .png" alt="image-20240131144606076" style="zoom:75%;" />
379+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240131144606076 .png" alt="image-20240131144606076" style="zoom:75%;" />
380380
381381### LSignal
382382
@@ -444,7 +444,7 @@ updated: 2024-05-01 10:10:00
444444
445445 - `connect`函数的作用是把槽函数加入到自身的槽函数列表中
446446
447- <img src="https://img-blog.csdnimg .cn/direct/5f64256ecc21488582c3e202334bc1ab .png" alt="image-20240201110235491" style="zoom:75%;" />
447+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240201110235491 .png" alt="image-20240201110235491" style="zoom:75%;" />
448448
449449 - `emit`函数的作用是发送信号,然后通过事件系统进行槽函数的调度
450450 - `disconnect`函数就很简单了,就是删除对应的槽函数
@@ -472,19 +472,19 @@ updated: 2024-05-01 10:10:00
472472
473473- 阅读到`LSignalEvent`的代码时候,没有对类的成员函数做相应处理(参见`LSignalConnection`),导致写`demo`时加上注释这一段编译不通过,测试程序在`./snippet/SignalEmitTest`,具体对比`LSignal`对两种类型的槽函数的不同处理
474474
475- <img src="https://img-blog.csdnimg .cn/direct/097ccd86696340c899b20ca175f6d3ae .png" alt="image-20240201142537356" style="zoom:75%;" />
475+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240201142537356 .png" alt="image-20240201142537356" style="zoom:75%;" />
476476
477477 - `2.20`更新
478478
479479 - 是我自己的原因,参数的放置有问题,第一个参数是成员函数指针,第二个参数是类对象指针,后面才是相应的参数
480480
481- <img src="https://img-blog.csdnimg .cn/direct/29ec5170758541559e7bee8cb1b53aa0 .png" alt="image-20240220112728945" style="zoom:80%;" />
481+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240220112728945 .png" alt="image-20240220112728945" style="zoom:80%;" />
482482
483483 - 这是因为`LSignalEvent`里面使用了`std::function`,`std::function`很方便的能够把类的成员函数,普通函数,带捕获和不带捕获的`lambda`统一起来,但是需要注意使用的参数规范
484484
485485 - 但是关于上面提到的问题,个人的看法是,第二个重载感觉有点抽象,第一个重载可以处理普通函数,带捕获和不带捕获的`lambda`;第二个这个参数形式,一开始确实没办法让我想到可以适用于类的成员函数,因为没有给定第二个参数,相当于第二个类指针的参数隐藏在了`rest...`中,这里建议做一些修改
486486
487- <img src="https://img-blog.csdnimg .cn/direct/4c381edb59f44cd688da41a428158fb0 .png" alt="image-20240220112939023" style="zoom:75%;" />
487+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240220112939023 .png" alt="image-20240220112939023" style="zoom:75%;" />
488488
489489 - 参照了这里的思路之后,关于`LSignal`无法处理带捕获的`lambda`,个人认为就可以使用`std::function`替代原本的函数指针了
490490
@@ -1204,7 +1204,7 @@ updated: 2024-05-01 10:10:00
12041204
12051205我以为这个类是拿来做画笔的相关绘制的,但其实设计并非我想的这样。这个类`LPen`只是一个数据存储类,保存了画笔需要的一些信息,例如画笔宽度、画笔连接样式、画笔颜色等,真正管理绘画的类是绘画引擎类,对于`LPen`是`LDrawEngine`以及其下面的工具类,这些类里面保存了`LPen`对象,并且针对不同的绘画做了不同的处理,包括下面的画刷`LBrush`也是一样的道理
12061206
1207- <img src="https://img-blog.csdnimg .cn/direct/81c0ae4e9f6d4684bc8d5c28bb60a5ac .png" alt="image-20240306104337531" style="zoom:85%;" />
1207+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240306104337531 .png" alt="image-20240306104337531" style="zoom:85%;" />
12081208
12091209### 画刷
12101210
@@ -1270,7 +1270,7 @@ updated: 2024-05-01 10:10:00
12701270
12711271 执行下来大概就是这个结果
12721272
1273- <img src="https://img-blog.csdnimg .cn/direct/3e0c2d0988174464a1997154a67d829e .png" alt="image-20240307145534071" style="zoom:67%;" />
1273+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240307145534071 .png" alt="image-20240307145534071" style="zoom:67%;" />
12741274
12751275### 菜单
12761276
@@ -1393,7 +1393,7 @@ updated: 2024-05-01 10:10:00
13931393
13941394 - 阅读了这个逻辑之后,我将整个绘图的范围画了一个图更清晰的展现,结合上面的代码就更容易理解了
13951395
1396- <img src="https://img-blog.csdnimg .cn/direct/2559ff78e2ca412db4ecbcafd8c54c78 .png" alt="image-20240312143539023" style="zoom:67%;" />
1396+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240312143539023 .png" alt="image-20240312143539023" style="zoom:67%;" />
13971397
139813983. 事件处理机制
13991399
@@ -2004,7 +2004,7 @@ updated: 2024-05-01 10:10:00
20042004
20052005 - 推导过程
20062006
2007- <img src="https://img-blog.csdnimg .cn/direct/6744797cf27e410cb9f6d45a6d5d622d.png " alt="96267918b6de05e058c90fee24804e4" style="zoom:30%;" />
2007+ <img src="https://image.davidingplus .cn/images/2025/01/31/96267918b6de05e058c90fee24804e4.jpg " alt="96267918b6de05e058c90fee24804e4" style="zoom:30%;" />
20082008
20092009 - 接口作用:根据输入点的坐标得出该点的颜色,本函数只负责将坐标转化为渐变比例`pos`(原始值),`pos`的处理和计算颜色的具体逻辑交给`getColorByPadMode()`和`getColorByRepeatMode()`
20102010
@@ -2227,7 +2227,7 @@ updated: 2024-05-01 10:10:00
22272227
22282228 - 对比了有这部分代码和没有这部分代码的`demo`效果,发现这是一个鼠标悬停效果,如下
22292229
2230- <img src="https://img-blog.csdnimg .cn/direct/dfa1c47a7a56454daa449a2b02be8d50 .png" alt="image-20240314095331865" style="zoom:85%;" />
2230+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240314095331865 .png" alt="image-20240314095331865" style="zoom:85%;" />
22312231
22322232 - 这样之后,`handleMouseMoveEvent()`就能解释了,实时判断鼠标位置来更新悬停效果
22332233
@@ -2427,13 +2427,13 @@ updated: 2024-05-01 10:10:00
24272427
24282428 - 补充:`xml`中预定义的实体引用
24292429
2430- 
2430+ 
24312431
243224323. `xml Token`,参考链接:[https://xmlbeans.apache.org/docs/2.0.0/guide/conUnderstandingXMLTokens.html](https://xmlbeans.apache.org/docs/2.0.0/guide/conUnderstandingXMLTokens.html)
24332433
24342434 - 对于一个`xml`文件,可以根据起始标签、内容、结束标签、注释、文档开始、文档结束等,将整个文档进行划分,每个小块就是一个`token`,当游标`cursor`移动的过程中,每个位置就会对应一个`tokenType`
24352435
2436- 
2436+ 
24372437
243824384. `xml DTD`,参考链接:[https://blog.csdn.net/gavin_john/article/details/51532756](https://blog.csdn.net/gavin_john/article/details/51532756)
24392439
@@ -2538,7 +2538,7 @@ updated: 2024-05-01 10:10:00
25382538
25392539 - 执行结果
25402540
2541- 
2541+ 
25422542
25432543### FileSystem
25442544
@@ -2871,7 +2871,7 @@ updated: 2024-05-01 10:10:00
28712871
28722872 - 示意图:
28732873
2874- <img src="https://img-blog.csdnimg .cn/direct/cb14624051954d9a916c0a0e02136c9a .png" alt="image-20240408095910960" style="zoom:75%;" />
2874+ <img src="https://image.davidingplus .cn/images/2025/01/31/image-20240408095910960 .png" alt="image-20240408095910960" style="zoom:75%;" />
28752875
28762876 - 第二步:从`m_pStream`中读取内容
28772877
0 commit comments