一.模板类和模板函数知识点整理
二.类相关问题记录
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的形式。