ros2-类继承,lambda,共享指针,多线程
类继承
cpp
#include "rclcpp/rclcpp.hpp"class PersonNode:public rclcpp::Node{private:std::string name_;int age_;public:PersonNode(const std::string &node_name, const std::string &name, const int &age):Node(node_name){ // 把nodename参数传进来,同时把nodename作为参数传给父类 相当于调用父类构造函数this->name_ = name;this->age_ = age;};void eat(const std::string &food_name){RCLCPP_INFO(this->get_logger(), "我是%s, %d岁, 爱吃%s", this->name_.c_str(), this->age_, food_name.c_str());};};int main(int argc, char** argv){rclcpp::init(argc, argv);auto node = std::make_shared<PersonNode>("person_node", "李斯", 18);// RCLCPP_INFO(node->get_logger(), "你好 c++节点");node->eat("ROS");rclcpp::spin(node);rclcpp::shutdown();return 0;
}
随后需要在cmake文件中增加可执行文件和link相关库
lambda
#include "iostream"
#include "algorithm"int main(){auto add = [](int a, int b) -> int{return a + b;};int sum = add(200 ,50);auto print_sum = [sum]() -> void{std::cout<<sum<<std::endl;};print_sum();
}
共享指针
#include "iostream"
#include "memory"int main(){auto p1 = std:: make_shared<std::string>("this is a ptr"); // std:: make_shared<数据类型/类>(参数); 返回值, 对应类的共享指针std::cout<<"p1的引用计数:" << p1.use_count() << " , 指向内存地址"<< p1.get()<<std::endl;auto p2 = p1;std::cout<<"p1的引用计数:" << p1.use_count() << " , 指向内存地址"<< p1.get()<<std::endl;std::cout<<"p2的引用计数:" << p2.use_count() << " , 指向内存地址"<< p2.get()<<std::endl;p1.reset(); // 释放引用std::cout<<"p1的引用计数:" << p1.use_count() << " , 指向内存地址"<< p1.get()<<std::endl;std::cout<<"p2的引用计数:" << p2.use_count() << " , 指向内存地址"<< p2.get()<<std::endl;std::cout<<"p2的指向内存地址数据:" <<p2->c_str() << std::endl; }
cmake_minimum_required(VERSION 3.5)
project(demo_cpp_pkg)# Default to C99
if(NOT CMAKE_C_STANDARD)set(CMAKE_C_STANDARD 99)
endif()# Default to C++14
if(NOT CMAKE_CXX_STANDARD)set(CMAKE_CXX_STANDARD 14)
endif()if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)find_package(rclcpp REQUIRED) # 直接查找到对应的头文件和库文件, REQUIRED 表示这个库为必须
add_executable(cpp_node src/cpp_node.cpp)
add_executable(person_node src/person_node.cpp)# target_include_directories(cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS}) # 头文件包含
# target_link_libraries(cpp_node ${rclcpp_LIBRARIES}) # 库文件链接
ament_target_dependencies(cpp_node rclcpp)
ament_target_dependencies(person_node rclcpp)add_executable(learn_lambda src/learn_lambda.cpp)
add_executable(learn_shared_ptr src/learn_shared_ptr.cpp)install(TARGETS cpp_node person_node learn_shared_ptr learn_lambdaDESTINATION lib/${PROJECT_NAME}
) # 用于复制文件到installif(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# uncomment the line when a copyright and license is not present in all source files#set(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# uncomment the line when this package is not in a git repo#set(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()
cmake文件,注意需要在install中将功能包名添加上