最新文�? Blender插件(Filp_Fluid):属性和运动模糊示例 Blender动画节点插件用户指南-分组 Blender插件(Filp_Fluid):示例_1:光滑粘性液体 Blender插件(Filp_Fluid):力场示例 Blender插件:Decalmachine(材质处理插件)
c++/c语言 历史版本:
上次修改时间:
C++ 虚函数和虚函数表详解 历史版本:
上次修改时间: 2022-03-09 16:21:47
chrono库的应用 历史版本:
上次修改时间: 2023-05-26 17:54:57
stl之遍历删除的正确方法 历史版本:
上次修改时间: 2021-01-21 00:54:49
std::thread正确关闭线程的用法 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++的三种继承方式 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++模板使用方法 历史版本:
上次修改时间: 2022-11-13 11:46:58
c++友元类和函数 历史版本:
上次修改时间: 2021-01-21 00:54:49
c#调用非托管DLL的方法 历史版本:
上次修改时间: 2021-01-21 00:54:49
关于c++ hpp文件 历史版本:
上次修改时间: 2021-01-21 00:54:49
std::function和lambda表达式 历史版本:
上次修改时间: 2023-03-06 11:27:18
c++的数学库 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++多个静态库组合成单个库文件 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++ 工程化-代码质量 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++ 标准编译错误 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++内存泄漏的几种常见情况 历史版本:
上次修改时间: 2021-01-21 00:54:49
智能指针和循环引用问题 历史版本:
上次修改时间: 2021-01-21 00:54:49
静态c++依赖库的链接顺序 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++ 常见工具库 历史版本:
上次修改时间: 2021-01-21 00:54:49
c c++ 代码内判断编译环境的方法 历史版本:
上次修改时间: 2021-01-21 00:54:49
mbedtls openssl等库的说明 历史版本:
上次修改时间: 2021-01-21 00:54:49
c++对象模型 历史版本:
上次修改时间: 2021-01-21 00:54:49
C++11 promise模式的实现 历史版本:
上次修改时间: 2021-03-08 15:49:51
c++ 11 内容 历史版本:
上次修改时间: 2021-03-13 15:37:50
c++11 atomic 历史版本:
上次修改时间: 2021-11-24 11:21:51
std::thread 历史版本:
上次修改时间: 2021-03-13 16:31:20
c++标准库线程安全 历史版本:
上次修改时间: 2021-10-09 15:45:08
c++ 线程池实现 历史版本:
上次修改时间: 2021-03-15 15:07:34
不同平台和编译器下库调用的方法和接口 历史版本:
上次修改时间: 2021-04-09 10:37:48
变长参数模板和偏例化 历史版本:
上次修改时间: 2021-11-25 17:37:26
c++ 动态类型识别和反射 历史版本:
上次修改时间: 2021-04-15 14:31:01
google c++风格 历史版本:
上次修改时间: 2021-04-24 23:42:23
引用和指针 历史版本:
上次修改时间: 2021-05-03 01:44:47
乐观锁悲观锁和CAS机制 历史版本:
上次修改时间: 2021-05-18 11:39:03
libuv 应用 历史版本:
上次修改时间: 2023-07-11 11:28:09
二维数组指针和指针数组 历史版本:
上次修改时间: 2021-06-05 13:36:14
c/c++ 前向声明的作用 历史版本:
上次修改时间: 2021-06-26 12:15:04
c++ 在头文件中隐藏私有变量 历史版本:
上次修改时间: 2021-07-03 23:50:16
c++ 类型转换 历史版本:
上次修改时间: 2021-12-16 15:51:22
B --> C --> D。pa 是A*类型的指针,当 pa 指向 A 类型的对象时,向下转型失败,pa 不能转换为B*或C*类型。当 pa 指向 D 类型的对象时,向下转型成功,pa 可以转换为B*或C*类型。同样都是向下转型,为什么 pa 指向的对象不同,转换的结果就大相径庭呢?
\n在《C++ RTTI机制下的对象内存模型(透彻)》一节中,我们讲到了有虚函数存在时对象的真实内存模型,并且也了解到,每个类都会在内存中保存一份类型信息,编译器会将存在继承关系的类的类型信息使用指针“连接”起来,从而形成一个继承链(Inheritance Chain),也就是如下图所示的样子:\n
\n\n![image.png](https://www.testingcloud.club/sapi/api/image_download/e8ab87c7-5e41-11ec-a639-525400dc6cec.png)
\n\n当使用 dynamic_cast 对指针进行类型转换时,程序会先找到该指针指向的对象,再根据对象找到当前类(指针指向的对象所属的类)的类型信息,并从此节点开始沿着继承链向上遍历,如果找到了要转化的目标类型,那么说明这种转换是安全的,就能够转换成功,如果没有找到要转换的目标类型,那么说明这种转换存在较大的风险,就不能转换。
\n\n对于本例中的情况①,pa 指向 A 类对象,根据该对象找到的就是 A 的类型信息,当程序从这个节点开始向上遍历时,发现 A 的上方没有要转换的 B 类型或 C 类型(实际上 A 的上方没有任何类型了),所以就转换败了。对于情况②,pa 指向 D 类对象,根据该对象找到的就是 D 的类型信息,程序从这个节点向上遍历的过程中,发现了 C 类型和 B 类型,所以就转换成功了。
\n\n总起来说,dynamic_cast 会在程序运行过程中遍历继承链,如果途中遇到了要转换的目标类型,那么就能够转换成功,如果直到继承链的顶点(最顶层的基类)还没有遇到要转换的目标类型,那么就转换失败。对于同一个指针(例如 pa),它指向的对象不同,会导致遍历继承链的起点不一样,途中能够匹配到的类型也不一样,所以相同的类型转换产生了不同的结果。
\n\n从表面上看起来 dynamic_cast 确实能够向下转型,本例也很好地证明了这一点:B 和 C 都是 A 的派生类,我们成功地将 pa 从 A 类型指针转换成了 B 和 C 类型指针。但是从本质上讲,dynamic_cast 还是只允许向上转型,因为它只会向上遍历继承链。造成这种假象的根本原因在于,派生类对象可以用任何一个基类的指针指向它,这样做始终是安全的。本例中的情况②,pa 指向的对象是 D 类型的,pa、pb、pc 都是 D 的基类的指针,所以它们都可以指向 D 类型的对象,dynamic_cast 只是让不同的基类指针指向同一个派生类对象罢了。
\n\n\n\n###### dynamic_cast转换失败的情况\n这个dynamic_cast是针对类的指针而言的,只要指针转换的对象类是不可访问的,那么就会失败。那么什么叫做不可访问呢?比如说,你要把子类的指针转换成父类的指针,但是子类是通过private继承了父类,此时父类的非private成员都是子类的private成员,所以子类的指针无法直接访问父类的非private成员,这时就会出现转换失败的问题。\n所以,你要想让指针转换成功,子类必须通过public继承父类。
\n可以推出,dynamic_cast是针对is-a关系设计的。
\n因为父类指针指向子类对象本身就是多态的性质,所以dynamic_cast存在的意义就在于让子类指针指向父类。
\n\n###### 指针类型\n举例,Base为包含至少一个虚函数的基类,Derived是Base的共有派生类,如果有一个指向Base的指针bp,我们可以在运行时将它转换成指向Derived的指针,代码如下:\n```\nif(Derived *dp = dynamic_cast(bp)){\n //使用dp指向的Derived对象 \n}\nelse{\n //使用bp指向的Base对象 \n}\n```\n值得注意的是,在上述代码中,if语句中定义了dp,这样做的好处是可以在一个操作中同时完成类型转换和条件检查两项任务。\n###### 引用类型\n因为不存在所谓空引用,所以引用类型的dynamic_cast转换与指针类型不同,在引用转换失败时,会抛出std::bad_cast异常,该异常定义在头文件typeinfo中。\n```\nvoid f(const Base &b){\n try{\n const Derived &d = dynamic_cast(b); \n //使用b引用的Derived对象\n }\n catch(std::bad_cast){\n //处理类型转换失败的情况\n }\n}\n```\n\n###### const_cast\nconst_cast,用于修改类型的const或volatile属性。
\n\n该运算符用来修改类型的const(唯一有此能力的C++-style转型操作符)或volatile属性。除了const 或volatile修饰之外, new_type和expression的类型是一样的。\n1. 常量指针被转化成非常量的指针,并且仍然指向原来的对象;\n2. 常量引用被转换成非常量的引用,并且仍然指向原来的对象;\n3. const_cast一般用于修改底指针。如const char *p形式。\n\n举例转换如下:\n```\nconst int g = 20;\nint *h = const_cast(&g);//去掉const常量const属性\n\nconst int g = 20;\nint &h = const_cast(g);//去掉const引用const属性\n\n const char *g = \"hello\";\nchar *h = const_cast(g);//去掉const指针const属性\n```\n\n###### reinterpret_cast\nnew_type必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。
\nreinterpret_cast意图执行低级转型,实际动作(及结果)可能取决于编辑器,这也就表示它不可移植。
\n举一个错误使用reintepret_cast例子,将整数类型转换成函数指针后,vc++在执行过程中会报\"...中的 0xxxxxxxxx 处有未经处理的异常: 0xC0000005: Access violation\"错误:
\n```\n#include \nusing namespace std;\nint output(int p){\n cout << p <(&p);\n fun2(p);//...处有未经处理的异常: 0xC0000005: Access violation\n return 0;\n}\n```\nMSDN中提到了,实际中可将reinterpret_cast应用到哈希函数中,如下(64位系统中需将unsigned int修改为unsigned long):\n```\n// expre_reinterpret_cast_Operator.cpp\n// compile with: /EHsc\n#include \n\n// Returns a hash code based on an address\nunsigned short Hash( void *p ) {\n unsigned int val = reinterpret_cast( p );\n return ( unsigned short )( val ^ (val >> 16));\n}\n\nusing namespace std;\nint main() {\n int a[20];\n for ( int i = 0; i < 20; i++ )\n cout << Hash( a + i ) << endl;\n}\n```\n\n另外,static_cast和reinterpret_cast的区别主要在于多重继承,比如
\n```\nclass A {\n public:\n int m_a;\n};\n \nclass B {\n public:\n int m_b;\n};\n \nclass C : public A, public B {};\n```\n那么对于以下代码:\n```\nC c;\nprintf(\"%p, %p, %p\", &c, reinterpret_cast(&c), static_cast (&c));\n```\n前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为static_cast计算了父子类指针转换的偏移量,并将之转换到正确的地址(c里面有m_a,m_b,转换为B*指针后指到m_b处),而reinterpret_cast却不会做这一层转换。
\n因此需要谨慎使用 reinterpret_cast。
\n \n\n##### 注意\n- 新式转换较旧式转换更受欢迎。原因有二,一是新式转型较易辨别,能简化“找出类型系统在哪个地方被破坏”的过程;二是各转型动作的目标愈窄化,编译器愈能诊断出错误的运用。\n- 尽量少使用转型操作,尤其是dynamic_cast,耗时较高,会导致性能的下降,尽量使用其他方法替代。\n\n -->
c++ 测试框架 Catch 历史版本:
上次修改时间: 2021-09-13 13:45:51
类继承的程序行为 历史版本:
上次修改时间: 2021-10-14 15:42:45
c++实现异步操作封装 历史版本:
上次修改时间: 2021-11-26 16:45:04
c++ 模板进阶 SFINAE 历史版本:
上次修改时间: 2021-11-26 15:16:14
c/c++ 函数的参数传递机制 历史版本:
上次修改时间: 2022-01-06 16:36:09
c++ 代码简洁 历史版本:
上次修改时间: 2022-01-21 00:18:42
构造函数抛出异常导致内存泄露 历史版本:
上次修改时间: 2022-02-23 16:07:43
google gtest 使用 历史版本:
上次修改时间: 2022-03-23 16:17:05
c++实现aop模式 历史版本:
上次修改时间: 2022-04-24 01:32:09
模板编程trick 历史版本:
上次修改时间: 2022-04-26 13:04:05
C++函数后面加“:”初始化的含义 历史版本:
上次修改时间: 2022-04-28 23:15:04
拷贝构造函数 历史版本:
上次修改时间: 2022-04-29 00:45:29
c++ stl 实现一个消息队列 历史版本:
上次修改时间: 2022-04-30 00:13:55
stl使用 历史版本:
上次修改时间:
cppunit原理分析以及例子 历史版本:
上次修改时间: 2022-06-29 21:34:36
ubuntu 开机启动脚本 历史版本:
上次修改时间: 2022-07-20 10:46:17
C++ 头文件接口设计 历史版本:
上次修改时间: 2023-02-21 11:29:16
条件变量和互斥锁 历史版本:
上次修改时间: 2023-03-06 10:42:30
常见c++开源库 历史版本:
上次修改时间: 2023-03-06 11:01:20
c++11 历史版本:
上次修改时间: 2023-03-18 21:37:18
HEX转BCD?? 历史版本:
上次修改时间:
0条评�?
全部评论

关于博主

an actually real engineer

通信工程专业毕业,7年开发经验

技术栈:

精通c/c++

精通golang

熟悉常见的脚本,js,lua,python,php

熟悉电路基础,嵌入式,单片机

耕耘领域:

服务端开发

嵌入式开发

git

>

gin接口代码CURD生成工具

sql ddl to struct and markdown,将sql表自动化生成代码内对应的结构体和markdown表格格式,节省宝贵的时间。

输入ddl:
输出代码:

qt .ui文件转css文件

duilib xml 自动生成绑定控件代码

协议调试器

基于lua虚拟机的的协议调试器软件 支持的协议有:

串口

tcp客户端/服务端

udp 组播/udp节点

tcp websocket 客户端/服务端

软件界面

使用例子: 通过脚本来获得接收到的数据并写入文件和展示在界面上

下载地址和源码

duilib版本源码 qt qml版本源码 二进制包

webrtc easy demo

webrtc c++ native 库 demo 实现功能:

基于QT

webrtc摄像头/桌面捕获功能

opengl渲染/多播放窗格管理

janus meeting room

下载地址和源码

源码 二进制包

wifi,蓝牙 - 无线开关

实现功能:

通过wifi/蓝牙实现远程开关电器或者其他电子设备

电路原理图:

实物图:

深度学习验证工具

vtk+pcl 点云编辑工具

实现功能:

1. 点云文件加载显示(.pcd obj stl)

2. 点云重建

3. 点云三角化

4. 点云缩放

下载地址:

源码 二进制包

虚拟示波器

硬件实物图:

实现原理

基本性能

采集频率: 取决于外部adc模块和ebaz4205矿板的以太网接口速率,最高可以达到100M/8 约为12.5MPS

上位机实现功能: 采集,显示波形,存储wave文件。

参数可运行时配置

上位机:

显示缓冲区大小可调

刷新率可调节

触发显示刷新可调节

进程守护工具

基本功能:

1. 守护进程,被守护程序崩溃后自动重启。

2. 进程输出获取,显示在编辑框中。

二进制包

openblt 烧录工具

基本功能:

1. 加载openblt 文件,下载到具有openblt bootloader 运行的单片机中。

二进制包

opencv 功能验证工具(开源项目二次开发)

基本功能:

1. 插件化图像处理流程,支持自定义图像处理流程。 2. 完善的日志和权限管理

二进制包

又一个modbus调试工具

最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
主打一个代码简单易修改。
特点:

1. 基于QT5

2. 基于libmodbus

3. 三方库完全跨平台,linux/windows。

二进制包

屏幕录制工具

1. 基于QT5

2. 基于ffmpeg

3. 支持自定义录屏

源代码

开源plutosdr 板卡

1. 完全开源

2. 提高固件定制服务

3. 硬件售价450 手焊产量有线

测试数据

内部DDS回环测试

接收测试

外部发送500MHZ FM波形

硬件原理图

matlab测试

2TRX版本

大部分plutosdr应用场景都是讲plutosdr板卡作为射频收发器来使用。
实际上plutosdr板卡本身运行linux 操作系统。是具有一定脱机运算的能力。 对于一些微型频谱检测,简单射频信号收发等应用完全可以将应用层直接实现在板卡上
相较于通过网卡或者USB口传输具有更稳定,带宽更高等优点。
本开源板卡由于了SD卡启动,较原版pluto支持了自定义启动应用的功能。
提供了应用层开发SDK(编译器,buildroot文件系统)。
通过usb连接电脑,经过RNDIS驱动可以近似为通过网卡连接
(支持固件的开发定制)。

二次开发例子

``` all:
arm-linux-gnueabihf-gcc -mfloat-abi=hard --sysroot=/root/v0.32_2trx/buildroot/output/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt
clean:
rm pluto_stream

bsdiff算法补丁生成器

1. 官方bsdiff算法例子自带bzip压缩方式

2. 本例子没有压缩,直接生成补丁文件

3. 图形化界面基于DUILIB

二进制文件

版面分析即分析出图片内的具体文件元素,如文档标题,文档内容,文档页码等,本工具基于cnstd模型

Base64 Image

. 闽ICP备19002644号