C++代码问题记录

一.模板类和模板函数知识点整理

二.类相关问题记录

1.类的定义和调用
如果头文件.h,源文件.cpp和调用文件main分开写的时候,main文件中调用的时候只需要引用.h文件就可以,否则会报错重复定义。

CMakeFiles/data_send_node.dir/src/datasend.cpp.o:在函数‘fileNameFilter(dirent const*)’中:
datasend.cpp:(.text+0x240): `fileNameFilter(dirent const*)'被多次定义
CMakeFiles/data_send_node.dir/src/datasender_node.cpp.o:datasender_node.cpp:(.text+0x240):第一次在此定义
CMakeFiles/data_send_node.dir/src/datasend.cpp.o:在函数‘DataSender::generate_message(int)’中:
datasend.cpp:(.text+0x440): `DataSender::generate_message(int)'被多次定义

2.类中有指针成员变量
如果类中有指针成员,只能在类定义时进行类别定义,分配空间只能在构造函数中进行。如果非智能指针,new出来的空间在析构函数中需要使用delete进行手动释放。

类定义是定义了一个指针
private:
  //img pointcloud
  pcl::PointCloud<pcl::PointXYZI>::Ptr cloud;
//实现构造函数的时候对指针进行初始化分配空间,这里是智能指针就不需要手动释放
DataSender::DataSender(pcl::PointCloud<pcl::PointXYZI>::Ptr pc):cloud(pc){

3.定义的类的成员变量是其他类时候,而且这个类初始化还需要参数的时候,就不太容易直接采用在private中定义,在构造函数中初始化。最好是采用类的指针,然后在构造函数中对指针进行初始化。
例子中:定义的类track_processor包含成员变量tracker_,这个成员变量是属于Tracker类,而且这个类实例化需要参数param,在这里就把它定义成智能指针。

class track_processor
{
public:
  track_processor();
  ~track_processor() {}
private:
	Param param;
   std::shared_ptr<Tracker> tracker_;
   };

在这里param中所有的成员变量都是定义为public,否则在外部类track_processor中是没有办法访问private成员的。
在构造函数中就对指针进行初始化

track_processor::track_processor(){
	tracker_ = std::make_shared<Tracker>(param);

智能指针定义参考:
参考一
参考二
弱指针解决循环引用问题的关键
互相指向时候采用了弱指针,不会使共享指针计数器_Uses增加,_Uses保持为1,只会增加弱指针计数器_Weak。销毁的时候_Uses减小为0,_Weak也会相应减小。最后会保证四块计数存储的内存都会清理。

弱指针和共享指针结合使用,可以解决两个共享指针之间相互指向造成的循环引用,内存泄露问题。
原因在于:
1.weak_ptr和shared_ptr一样都是共有继承自_Ptr_base。
2.它和shared_ptr的构造大体上相同,不过在增加引用计数的值时,shared_ptr是增加_Uses的值,而weak_ptr是增加_Weaks的值。同样在类对象销毁时,share_ptr通过_Uses减1是否为0来判断是否销毁,而weak_ptr是通过_Weak减1是否为0来判断。
————————————————
版权声明:本文为CSDN博主「Programer陈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ChenYang1998/article/details/78388780

4.ROS中定义订阅者的时候报错出现 invalid use of non-static member function
初始化subscriber时问题的解决
错误的写法:

datasub = nh.subscribe("/objects", 10, &track_processor::process);

修改之后:

datasub = nh.subscribe("/objects", 10, &track_processor::process, this);

原因大概是这个:在C++语言中,对于一个由类名加俩冒号再加成员名构成的东西(学名叫“quilified-id”),比如:A::x,只有当x是A类的静态成员的时候,A::x才能表示一个左值。而对于函数类型到函数指针类型的默认转换,只有当函数类型是左值的时候才行。
而且要注意回调函数必须是返回值为void的形式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值