pcl八叉树模块提问

在使用CLion时,使用pcl八叉树获得根结点时,最后一行报错。


    float resolution = 0.01f;
    pcl::octree::OctreePointCloud<pcl::PointXYZ> octree(resolution);
    octree.setInputCloud(cloud);
    octree.addPointsFromInputCloud();

    // 获取根节点
    pcl::octree::OctreeNode* root = octree.getRootNode();

报错

'getRootNode' is a protected member of 'pcl::octree::OctreeBase<pcl::octree::OctreeContainerPointIndices>'

但是pcl::octree::OctreePointCloud<pcl::PointXYZ>pcl::octree::OctreeBase<pcl::octree::OctreeContainerPointIndices>的子类,为什么子类对象无法访问到父类中受保护的方法?

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在C++中,子类可以访问父类的公共成员和受保护成员,但不能访问私有成员。所以理论上说,子类对象可以访问父类中受保护的方法。但在这个问题中,getRootNode函数是pcl::octree::OctreeBase类中受保护的成员函数,而不是pcl::octree::OctreePointCloud类中的公共或受保护成员函数。因此,它不能直接从pcl::octree::OctreePointCloud对象中访问。

受保护的成员函数只能被类本身和其子类的成员函数访问,而不能被类对象或其他非成员函数访问。因此,在这个问题中,可以通过在pcl::octree::OctreePointCloud类的子类中添加一个公共成员函数来访问getRootNode函数。例如,可以在子类中添加如下代码:

pcl::octree::OctreeNode* getRoot() {
    return this->getRootNode();
}

然后就可以通过子类对象调用该函数来访问getRootNode函数了。例如:

pcl::octree::OctreePointCloud<pcl::PointXYZ> octree(resolution);
// ...
pcl::octree::OctreePointCloud<pcl::PointXYZ>::OctreeNode* root = octree.getRoot();

在这个示例中,getRoot函数是在pcl::octree::OctreePointCloud类的子类中添加的,它调用了父类中的getRootNode函数来获取根节点。注意,在函数名后面需要加上pcl::octree::OctreePointCloud<pcl::PointXYZ>::来指定函数是在哪个类中定义的。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 这篇博客: ubuntu下如何使用Clion愉快的编写pcl中的 注意 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • clion与搜狗输入法冲突,一运行clion就卡死,卸载搜狗吧,装别的输入法,我用的谷歌pinyin。