现在是怎么个关系呢。。。
map_builder_bridge map_builder_interface 还有map_builder
我感觉应该是 map_builder_bridge是提供给外面调用的
map_builder_interface 是提供接口定义 ,map_builder是实现,就是说:
map_builder_bridge的里面定义了private的map_builder_interface,map_builder继承了map_builder_interface。
查阅map_builder_interface和map_builder的方法定义,发现在map_builder_interface中定义的虚函数 在map_builder里面有部分实现。现在的问题是,应该在map_builder_bridge里面定义到这个map_builder,下面是要找到他。
找到了。是在node_main里面传入了map_builder,而他的定义是
梳理一下:
Node的声明:
Node(const NodeOptions& node_options,
std::unique_ptr<cartographer::mapping::MapBuilderInterface> map_builder, //不应该是bridge吗?
tf2_ros::Buffer* tf_buffer, bool collect_metrics);
Node的定义:
Node::Node(
const NodeOptions& node_options,
std::unique_ptr<cartographer::mapping::MapBuilderInterface> map_builder,
tf2_ros::Buffer* const tf_buffer, const bool collect_metrics)
: node_options_(node_options),
map_builder_bridge_(node_options_, std::move(map_builder), tf_buffer) { //std::move(map_builder) 左值变右值 int a = 10 ; int b =a(error) ---> int b = move(a)
// 将mutex_上锁, 防止在初始化时数据被更改
absl::MutexLock lock(&mutex_);
Node的实例化:
// Node类的初始化, 将ROS的topic传入SLAM, 也就是MapBuilder
Node node(node_options, std::move(map_builder), &tf_buffer,
FLAGS_collect_metrics);
可以看到Node构造函数中要有一个interface的接口类,并且有bridge的成员变量。bridge类中有一个interface的私有成员变量。
在Node实例化的过程中,传入了map_builder的子类对象。
Node node(node_options, std::move(map_builder), &tf_buffer,
FLAGS_collect_metrics);
这样就会调用Node的构造函数,可以看到Node构造函数其实除了初始化成员列表,剩下的啥也没有干。在初始化函数列表的时候,就完成了map的多态,并且完成了bridge类的初始化:
map_builder_bridge_(node_options_, std::move(map_builder), tf_buffer)
就这样,完成了子类对象的传入和node_main->node->map_builer_bridge->map_builder_interface->map_builder的实现。
node -->构造函数中有 map_builder_interface
-→成员变量中有map_builder_bridge
map_builder_bridge -->构造函数中有 map_builder_interface
→成员变量中有map_builder_bridge
→成员函数中有对map_builder_interface的调用
map_builder子类对象,只需要传到node类的构造函数,构造函数再对bridge初始化就完成了。