如何子类化和重新实现命名空间中包含的类?

Posted

技术标签:

【中文标题】如何子类化和重新实现命名空间中包含的类?【英文标题】:How to subclass and reimplement a class contained in a namespace? 【发布时间】:2018-03-10 12:11:46 【问题描述】:

我正在尝试使用 PCLVisualizer 来可视化点云。

https://github.com/PointCloudLibrary/pcl/blob/master/visualization/src/pcl_visualizer.cpp

我需要使用点拾取事件来获取我在可视化器中用鼠标左键单击点云时选择的点的 z,y,z 坐标:

https://github.com/PointCloudLibrary/pcl/blob/master/visualization/src/point_picking_event.cpp

问题在于 point_picking_event.cpp 代码要求按下 SHIFT 键。这是无键盘系统(运行 Qt),因此无法选择 SHIFT 键。

我的计划是继承类

pcl::visualization::PointPickingCallback

并更改 pcl::visualization::PointPickingCallback::Execute 中检查 SHIFT 键的代码

if ((eventid == vtkCommand::LeftButtonPressEvent) && (iren->GetShiftKey () > 0))

 if (eventid == vtkCommand::LeftButtonPressEvent)

然后我会将继承的类放在它自己的命名空间mynamespace 中,并将其命名为inhPointPickingCallback 之类的名称

新功能

mynamespace::inhPointPickingCallback::Execute

现在只是不检查 SHIFT 键,我们应该很好。

问题: 我无法理解如何继承和重新定义这个类。 (我正在将我的 C++ 从初级提升到更高级的水平)。

你能帮我编译一个包含头文件 (.h) 文件和继承 pcl::visualization::PointPickingCallback重新实现函数 pcl::visualization::PointPickingCallback::Execute (...) 的 .cpp 文件的示例

https://github.com/PointCloudLibrary/pcl/blob/master/visualization/src/point_picking_event.cpp https://github.com/PointCloudLibrary/pcl/blob/master/visualization/include/pcl/visualization/point_picking_event.h

在其自己的命名空间和类mynamespace::inhPointPickingCallback::Execute (...) 中更改代码以不检查 SHIFT 键?

【问题讨论】:

对我来说听起来像是一个 XY 问题。为什么不能像reinterpret_cast<pcl::visualization::PCLVisualizerInteractorStyle*>(caller)->GetInteractor()->SetShiftKey(1)这样设置shift键? 【参考方案1】:

这个例子应该让你开始了解继承和命名空间。它的直截了当只是在您想要的命名空间中声明您的新类并从中派生。代码很简单,将它拆分为 header 和 cpp 应该没有任何问题。

#include <iostream>

namespace pcl
namespace visualization 
     class PointPickingCallback
         public:
         PointPickingCallback()
             std::cout << "Contruct PointPickingCallback" << std::endl;
         
         virtual void Execute()
             std::cout << "With shift" << std::endl;
         
     ;



namespace mynamespace
    class InhPointPickingCallback : public pcl::visualization::PointPickingCallback 
        public:
        InhPointPickingCallback()
            std::cout << "Contruct Inherited PPC" << std::endl;
        
        void Execute() override //note override is c++11
            std::cout << "Without shift" << std::endl;
        
    ;


int main()

    //without inheritance
    //pcl::visualization::PointPickingCallback ppc;
    mynamespace::InhPointPickingCallback ppc;
    ppc.Execute();
    return 0;

【讨论】:

以上是关于如何子类化和重新实现命名空间中包含的类?的主要内容,如果未能解决你的问题,请参考以下文章

不同命名空间内的类的循环依赖 C++

当顶层命名空间包含基类而内部命名空间包含子类时的 C# 命名空间和类/子类命名约定

实体框架生成的类不在我需要的命名空间中,有没有办法在不重新生成的情况下更改它使用的命名空间?

PHP命名空间

天宇联T语言编程Ⅰ

背水一战 Windows 10 (122) - 其它: 通过 Windows.System.Profile 命名空间下的类获取信息, 查找指定类或接口的所在程序集的所有子类和子接口