自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 资源 (7)
  • 收藏
  • 关注

原创 C++:什么情况下函数应该声明为纯虚函数

这是因为当删除一个指向派生类的基类指针时,会首先调用派生类的析构函数,然后调用基类的析构函数。因此,即使析构函数是纯虚函数,也需要在基类中提供一个实现(可以是空的)。:当你希望定义一个基类,该基类不能被实例化,只能作为其他类的基类时,你应该在基类中声明至少一个纯虚函数。这样的基类被称为抽象基类。纯虚函数通过在函数声明后添加 “= 0” 来定义,表示该函数在基类中没有实现,派生类必须提供实现。:如果你希望所有派生类都实现某个特定功能,而该功能在基类中没有意义或无法提供通用实现,你应该将该功能声明为纯虚函数。

2024-03-16 00:07:20 390

原创 C++:基类中的函数什么情况下声明为虚函数

如果你正在设计一个类层次结构,并希望它在未来是可扩展的,即使现在某些函数在基类中没有实际的实现或只提供了默认实现,也应该考虑将它们声明为虚函数。虚函数会带来一些开销,包括在对象中添加虚函数表指针,以及通过虚函数表进行动态分派的时间开销。另外,要注意的是,构造函数不能被声明为虚函数,因为虚函数机制依赖于对象已经存在并包含了虚函数表指针,而构造函数正是在对象创建过程中被调用的。:如果你预计派生类可能需要提供自己的实现,或者改变基类函数的行为,那么基类中的该函数应该被声明为虚函数。

2024-03-16 00:00:20 420

原创 C++: 析构函数应该被声明为虚析构函数的情况

这是因为如果基类的指针指向派生类的对象,并且该基类的析构函数不是虚析构函数,那么当删除这个基类指针时,只有基类的析构函数会被调用,而派生类的析构函数则不会被调用,这可能会导致资源泄露或未定义行为。通过声明虚析构函数,可以确保当基类指针被删除时,正确的析构函数(即派生类的析构函数)会被调用。然而,如果一个类不准备作为基类使用,或者确定不会有基类指针指向派生类对象的情况,那么将析构函数声明为虚析构函数可能并不是必要的。此时,将析构函数声明为虚析构函数可以确保正确的析构顺序。

2024-03-15 23:48:33 379

原创 NestJS入门:参考文章

知乎上对NestJS入门比较好的专栏文章。

2024-02-22 19:30:17 371

原创 NestJS入门9:管道入门

本文仅对ParseIntPipe管道做简单说明,这个管道的作用是对输入数据转换为所需要的类型(int)可见ParseIntPipe内部已做了异常处理,当为非整数时,自动触发了异常输出。use.controller.ts中增加一行打印id的类型。打印如下,管道将string类型的id转换为数字类型。注:不需要npm 安装任何工具。本文代码基于上一篇文章《

2024-02-21 21:42:54 463

原创 NestJS入门8:拦截器

本文代码基于前文《》上修改。

2024-02-20 22:12:45 430

原创 NestJS入门7:增加异常过滤器

本文代码基于上一篇文章《

2024-02-20 21:52:05 527

原创 NestJS入门6:日志中间件

使用postman或swagger测试,后端可以看到请求方法与路径的打印。可改为星号通配符,表示任意路由。

2024-02-20 20:24:31 784

原创 NestJS入门5:加入Swagger

【代码】NestJS入门5:加入Swagger。

2024-02-20 14:47:16 423

原创 NestJS入门4:MySQL typeorm 增删改查

user/entities/user.entity.ts修改为。user.controller.ts不需要修改。以上代码通过post可以数据到数据库,如下。以上代码重新运行后,可以看到数据表。

2024-02-19 23:19:49 451

原创 NestJS入门:不同请求方式前后端写法

【代码】NestJS入门:不同请求方式前后端写法。

2024-02-19 19:48:50 354

原创 NestJS入门2:创建模块

执行完后会在src文件夹下创建出user文件夹及文件夹下相应的文件,如下。在项目目录下输入以下命令。

2024-02-19 19:31:05 451

原创 NestJS入门1:创建项目

管理员权限运行CMD进入某个文件夹,输入命令,进行初始化,该命令不在文件夹下产生文件。

2024-02-19 18:13:55 396

原创 modbus协议与nodejs modbus-serial实现

polling_RTU是使用485串口来实现modbus通信, polling_TCP和 polling_UDP则使用TCP/UDP来实现通信。对于RTU(485串口)模式,modbus-serial自动在数据包末尾添加2个字节的CRC校验码,不需要显式添加。时,发送的指令码格式如下所示,总共8个字节,比TCP、UDP模式增加了2个字节的CRC校验码。功能码一般分为0x03(读Holding寄存器功能码)和0x04(读Input寄存器功能码)写入多个寄存器,对应的功能码为16(0x10)

2023-05-16 21:06:42 3069 1

原创 Nodejs移植到嵌入式ARM板方法

在上位机虚拟机软件上安装ARM的交叉编译链,下载nodejs源码,使用交叉编译软件编译nodejs,得到ARM板上可执行的文件,并放到ARM板上,通过node xxx.js文件的方式执行。注意还需要移植依赖库到ARM板上。需要一台与ARM相同架构并自带ubuntu或统信等系统的设备,在上面安装部署nodejs的环境,使用run pkg打包的方法在该环境下将源码打包成应用程序的可执行文件,然后将应用程序的可执行文件拷贝到ARM开发板上。在该系统下直接安装nodejs的环境,并运行程序。

2023-05-15 21:14:23 1337

原创 Nginx学习2:nginx代理websocket

nginx代理websocket指客户端通过websocket访问服务的A端口,nginx可以将该websocket连接与通信代理转发到后端的B端口,其配置文件如下设置。客户端通过ws://127.0.0.1:8081/socket2 可与后端的9999端口通信。客户端通过ws://127.0.0.1:8081/socket 可与后端的8888端口通信。后端存在两个ws服务,分别监听8888与9999端口。

2023-03-29 21:49:19 2349

原创 Nginx学习1:通过访问路径代理不同二级http服务

通过nginx实现代理,前端HTML5只需要对接一个http端口,即可与后台多个二级http服务进行对接,方法是在nginx中通过不同的路径代理不同的二级http服务。静态页面依然使用nginx一级服务器返回。

2023-03-26 18:05:23 3370

原创 【metaRTC学习】metaRTC的demo运行说明(一)

对metaRTC的demo做详细运行说明

2022-12-05 21:53:53 17624

原创 【Web流媒体开发】ffmpeg+JSMPEG+NodeJs+Web流媒体方案

架构图如下所示:1. 下载jsmpeg下载:https://codeload.github.com/phoboslab/jsmpeg/zip/master直接解压即可, 在解压的目录jsmpeg-master下会有websocket-relay.js文件2. 安装http-server在以上jsmpeg-master目录下安装websocket服务与http-servernpm install ws -gnpm install http-server -g..

2022-05-09 20:58:46 2705 1

原创 【NodeJs实战】Express实现Socket.IO

服务端:app.jsvar express = require('express');var app = express();var server = require('http').Server(app);var path = require('path');var io = require('socket.io')(server);app.use(express.static(path.join(__dirname, 'public')));//设置静态文件存放目录在public下.

2022-05-07 19:52:35 1447

原创 [NodeJS] 使用Express multer搭建文件上传服务

1. 搭建Express项目安装expressnpm install express创建express项目,以下app-server为项目名npm install app-servercd 进入app-server目录,并运行 npm install 安装相关依赖库注意在app-server/bin目录的www文件里指定了端口,默认为3000,我这里改为3002,避免与其他服务冲突再输入npm start命令即运行express服务...

2022-04-14 21:38:50 1052

原创 Websocket和Socket.io的区别及应用

Websocket和Socket.io的区别及应用 - 简书

2022-04-11 19:46:45 2547

原创 [NodeJS实战]NodeJS WebSocket实例

WebSocket服务端,在node中运行const WebSocket = require('ws');var wss = new WebSocket.Server({ port: 8181 });wss.on('connection', function (ws) { console.log('client connected'); ws.on('message', function (data, isBinary) { console.log('Mes

2022-04-11 19:17:47 8868

原创 【NodeJS实战】建立TCP客户端发送二进制协议

作为TCP客户端与服务端通信通信协议带二进制协议头,二进制头中带命令字与数据长度,协议头之后为实际数据。var net = require('net');var client = new net.Socket();client.setEncoding('utf8');var serverIp = "127.0.0.1";var serverPort = 9000;var data = '<request version="1">\<name>admin</.

2021-12-06 22:25:14 973

原创 C++接口的含义

看以下代码:```cpp#include <iostream>#include <stdlib.h>using namespace std;class Interface{public: Interface() {} virtual ~Interface() {} virtual void Test() = 0;};class TT :public Interface{public: TT() {} ~TT() {} virtual void T

2021-09-06 21:02:29 1092 3

原创 live555工程解析:testRTSPClient.cpp解析(1)

调用 rtspClient->sendDescribeCommand(continueAfterDESCRIBE); 打印信息如下:continueAfterDESCRIBE回调中再打印信息:上面打印信息为:上面两个红框分别打印如下:之后再调用setupNextSubsession之后调用:打印如下:打印如下:打印如下:...

2021-08-09 23:14:11 623

原创 TCP连接与断开连接 WireShark分析

TCP的三次握手、数据传输、四次挥手

2021-07-18 23:17:53 622 1

原创 UML关系C++表示:依赖与关联(聚合与组合)

程序员过了三十岁后,心里都会有“三十五岁”危机,即很多公司招聘研发人员基本不考虑超过三十五岁的研发人员,过来三十岁后,心里就会有焦虑,就得开始考虑以后的出路。研发人员的职业发展一方面与自身能力相关,一方面也受在职的单位的影响。...

2021-07-03 16:10:37 1133

原创 设计模式:创建者模式

#include <iostream>using namespace std;class Builder{public: Builder() {}; virtual ~Builder() {}; virtual void BuilderPartA() = 0; virtual void BuilderPartB() = 0;};class Director{public: Director(Builder *pBuilder) :m_pBuilder(...

2021-07-03 13:43:17 117 1

原创 A类的成员对象B调用A类的成员函数方法(3)

方法:与方法2相同,但使用智能指针传递father的this指针client.hclass base:public std::enable_shared_from_this<base>{public: base() {} virtual ~base() { } virtual void doSomething() = 0;};class client{public: client(const std::shared_ptr<base> &p)

2021-06-29 10:19:59 351

原创 A类的成员对象B调用A类的成员函数方法(2)

1. 基于Boostshared_ptr<boost::thread> threadPtr;threadPtr = make_shared<boost::thread>(std::bind(&CClassName::ClassThread, this, this));

2021-06-28 23:45:45 452

原创 A类的成员对象B调用A类的成员函数方法(1)

father.h头文件#pragma once#include <memory>#include <iostream>#include "client.h"class father{public: father() { } ~father() { } void init() { m_clientPtr = std::make_shared<client>(this); m_clientPtr->test(); } void

2021-06-28 23:28:32 608

原创 利用虚函数实现成员对象对父对象的回调

利用虚函数实现成员对象对父对象的回调:#include <iostream>class NetListen{public: virtual void OnReceiver(int data) =0;};class NetClient{public: NetClient(){}; ~NetClient(){}; void Init(NetListen* listener){ m_listener = listener;.

2021-03-16 23:43:08 212

原创 嵌入式开发(八):makefie文件

makefie文件参数 -c 编译阶段使用,不做连接。生成ojb目标文件(.o)。如果不加该选项,直接完成编译与连接,并且不生成过程文件 -o 指定输出文件,后面跟目标文件名,编译与连接阶段均可用 -g 生成调试信息 -MD 生成目标文件的依赖关系,存放于.d文件中 -MP...

2021-02-24 18:15:53 9134 1

原创 嵌入式开发(七):thrift库ubuntu端编译

1.下载thrift下载路径:http://archive.apache.org/dist/thrift/我这里下载了0.10.0版本,得到thrift-0.10.0.tar.gz, 解压tar -zxf thrift-0.10.0.tar.gz, 得到thrift-0.10.0目录2. 编译并安装在目录下执行:./configure也可以./configure --prefix=/xxx/yyy 来设置安装后的路径执行完后会在当前目录下生成Makefile文件执行.

2021-02-20 22:56:53 464

原创 嵌入式开发(六):websocketpp服务端海思交叉编译及使用

前提条件:需先编译好boost库,参考我的另外一篇文章嵌入式开发(五):海思Hi3559AV100交叉编译boost1.下载websocketpp下载路径https://github.com/zaphoyd/websocketpp/得到websocketpp-master.zip解压得到websocketpp-master目录2. 编译server进入websocketpp-master/examples/telemetry_server这里使用/telemetry_server的原

2021-02-20 21:11:47 1375

原创 嵌入式开发(五):海思Hi3559AV100交叉编译boost

1. 下载 boost_1_70_0.tar.gz2. 解压 tar -xzf booboost_1_70_0.tar.gz解压后boost_1_70_0目录里包含了一个boost的目录,这个就是boost库的头文件目录,可以将该目录移到其他路径,其他依赖boost库的程序需要指定该目录路径。3. 执行./bootstrap.shcd 进入boost_1_70_0,执行./bootstrap.sh,会在当前目录下生成b2, bjam, project-config.jam三个主要文件4. .

2021-02-20 19:53:40 1128

原创 AI芯片算力比较

1. 算力TOPS(Tera Operations Per Second),1 TOPS代表处理器每秒钟可进行一万亿次(10^12)操作FLOPS(floating-point operations per second),每秒所执行的浮点运算次数,1 TFLOPS(tera FLOPS)等于每秒一万亿(=10^12)次的浮点运算因浮点运算对性能要求较高,在保证AI精度的同时可将浮点数转为整数进行计算,可大幅降低计算资源的消耗,提高计算性能,可分为INT8, INT4, INT16,INT32, I

2021-01-20 21:33:48 18961 5

原创 fstream文件读写操作

fstream文件读写操作#include <fstream>using namespace std;int main(){ // 文件读写操作 ifstream file_in; ofstream file_out("./out.html"); string txt; file_in.open("./index.html", std::ios::in); if (file_in.is_open() &&

2021-01-17 21:59:06 517

原创 MP4、AVI, YUV, MOV等转换为*.h264格式

MP4、AVI, YUV, MOV等转换为*.h264格式在嵌入式系统中,程序往往无法直接解码mp4,avi等格式视频文件,需将其转换为裸流.h264格式,方法如下:PC上下载ffmpeg工具,切换到ffmpeg.exe的目录,用cmd打开命令行窗口:.mp4转.h264:ffmpeg -i 1920x1080.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 1920x1080.h264.avi转.h264:ffmpeg -i 160

2020-11-26 20:14:38 2814

unity鼠标点击3D物体响应事件

Unity给3D物体添加点击事件脚本,Unity给3D物体添加点击事件脚本。实测,真实可用

2018-08-08

Windows下设备驱动程序的开发方法

Windows下设备驱动程序的开发方法, DDK驱动程序开发

2014-06-26

图像NMF分解MATLAB代码

图像NMF(非负矩阵分解)分解MATLAB代码

2013-09-22

VSS使用手册(比较详细)

版本控制是工作组软件开发中的重要方面,它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时,源代码的控制是非常有用的。

2009-08-11

基于Matlab的图像DCT变换并压缩

基于Matlab的图像DCT变换并压缩。先读入图像,并作二维DCT变换,提取低频部分,对低频部分进行压缩。

2009-08-08

net.sf.jadclipse_3.3.0.jar

net.sf.jadclipse_3.3.0.jar

2009-08-04

net.sf.jadclipse_3.2.4.jar

net.sf.jadclipse_3.2.4.jar

2009-08-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除