![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 50
集智飞行
机器人,无人机,集群协同控制领域,软硬件经验分享
展开
-
C++类成员变量初始化顺序陷阱
因为成员变量的初始化次序是根据变量在内存的次序有关系,而变量的内存排列顺序,早在编译期就根据变量的定义次序决定了。这里a_和b_按照定义的顺序来初始化,也就是a_初始化的时候b_还没初始化呢,a_不一定是5。下面这种也是一样的,a_和b_是按照定义的顺序来初始化,即a_初始化的时候b_还没初始化呢。这里肯定是a_先初始化,b_后初始化。,更好的做法是都在构造函数内部初始化。原创 2024-01-25 22:49:02 · 441 阅读 · 0 评论 -
PX4经纬度转东北天坐标c++代码
附上geo.h和geo.cpp,编译的时候可以把geo.cpp编译成一个library再链接到你的程序,或者和你的程序一起编译。float的精度是不能满足小数点后七到八位的要求的。原创 2024-01-25 22:30:52 · 529 阅读 · 0 评论 -
c++信号槽signal2的用法
这里连接信号connect后的函数不能呢个直接用ClassA::func,因为它还没有实例化。所以这里必须用boost::bind处理一下这个类里的函数,把this包含进去,从而让程序在运行时能知道这个函数具体是那个对象的。placeholders时占位符,函数有几个参数就需要几个占位符。c++ boost库提供的signal2很好用,适用于某一处需要执行多个函数,但是具体的函数个数和种类需要在运行时调整的情况。类似的std库里也有std::bind和std::placeholders。原创 2024-01-25 20:59:23 · 426 阅读 · 0 评论 -
ROS1工作空间内多个包先后编译顺序、包内编译顺序
在ros工作空间里有packageA和packageB两个包,其中第二个包依赖第一个包。原创 2024-01-25 20:35:14 · 647 阅读 · 0 评论 -
c++类中实例化对象的正确方法
通过拷贝内部的shared_ptr巧妙地解决了这个问题。这是我在阅读ROS1源码时学到的方法,ROS1的subscriber、publisher、timer都是这种构造方式。原创 2024-01-25 17:27:45 · 904 阅读 · 0 评论 -
ROS1 nodelet用法
nodelet的好处:进程内的ROS话题发布和接收可以省去序列化和反序列化、socket通信的过程,而是通过shared_ptr共享内存实现,对于数据量大的话题也许可以降低延迟减少丢包。但前提是publisher必须用shared_ptr的方法发布话题,比如:原创 2024-01-25 16:32:30 · 400 阅读 · 0 评论 -
ROS1节点到底有几个线程
python版本的ROS1节点会给每个subscriber,每个timer新建一个线程。c++版本的ROS1节点要复杂得多。roscpp建立了一个global callback queue回调队列,所有的subscriber和timer都将自己的回调add到这个callback queue上.原创 2024-01-25 15:55:42 · 1287 阅读 · 0 评论 -
慎用少用c++的static和extern变量-几个常见错误
普通的变量是局部的,只存活于它所在的那个大括号(局部作用域)里,程序运行到超出这个区域后就会被销毁。static修饰的静态变量由于存储于进程的全局数据区,即使程序运行超出了它所在的大括号,该变量依然保持。这貌似给写程序带来了一些便利,但由于类中的static变量是由该类的所有实例化对象所共有,这往往不是我们想要的。举几个常见的例子:比如要写一个周期判断函数,需要记录上一时刻的时间: 这个func函数为了完成计时功能,需要让类ClassA定义一个last_time。如果用static变量就会让f原创 2024-01-24 17:01:24 · 1122 阅读 · 0 评论 -
c++模板函数的声明和定义必须在一个文件
非要分开写的话,需要在cpp文件中进行模板的显式实例化,但这需要把所有用到的T都列出来。或者在头文件末尾include 这个cpp文件,但这本质和写在一个头文件没有区别,而且由于cpp文件往往没有防止重复include的机制,链接时容易报错重复定义。不同于一般c++函数,声明可以在头文件,定义可以在cpp文件。模板函数的声明和定义必须放在一起,否则编译链接会报错。原创 2024-01-24 14:58:50 · 554 阅读 · 0 评论 -
C++函数返回值类型不确定处理办法-函数重载
这样定义肯定是会报错的。因为同名函数的重载只能用于参数列表或者实现(定义)不同,而不能用于返回值不同的情况。对于需要改动的值不加const,对于输入值可以加const保护一下不被修改。换一个思路,可以利用c++函数参数的。原创 2023-12-14 12:35:05 · 293 阅读 · 0 评论 -
c++用#define宏定义来批量实例化对象
如果之后还要对这些对象都进行统一的一系列操作,比如obj1.update(), obj2.update(), ...那就会显得代码非常冗长。此时可以用宏定义来生成类似的模板。参考自 PX4-Autopilot/platforms/common/include/px4_platform_common/param.h。如果要定义的类很多,那 DEFINE_CLASSES 宏定义就会写的特别长。,里面包含了APPLY_ALL宏定义,最多支持149个参数。其中 __VA_ARGS__ 表示 (...) 中的参数。原创 2023-12-14 11:19:35 · 280 阅读 · 0 评论