通过 C++ 中的构造函数将地址参数传递给基 class 指针

Pass address parameter to base class pointer via constructors in C++

我正在使用从基class继承的抽象类型指针。

目前,每个子class 必须在其构造函数中包含以下行为:

p = &f; //where p is the inherited pointer and f is the subclass filter

当然,我希望将此行为提升到基础 class 但我正在努力完成这项工作。我不确定这是因为我声明类型的方式,还是我需要更改实现以反映行为的移动(或其他原因!)。

我基本上尝试复制这一行并通过 subclass 构造函数调用基本构造函数:

//base.h
class Base {
    pcl::Filter<pcl::PointXYZRGB>* f;
    public:
        Base(pcl::Filter<pcl::PointXYZRGB> abs_filter);
};

//base.cpp
Base::Base(pcl::Filter<pcl::PointXYZRGB> abs_filter) { f = &abs_filter; }

//subclass.h
class Subclass: public Base {
    pcl::VoxelGrid<pcl::PointXYZRGB> vg;
    public:
        Subclass(void);
};

//subclass.cpp
Subclass::Subclass(void): Base(vg) { }

这将无法编译并产生以下错误:

error: cannot declare parameter ‘abs_filter’ to be of abstract type ‘pcl::Filter<pcl::PointXYZRGB>’

我尝试获取地址 pcl::Filter<pcl::PointXYZRGB> &abs_filter 并将方法更改为 f = abs_filter; 但这也无法编译,报告如下:

error: cannot convert ‘pcl::Filter<pcl::PointXYZRGB>’ to ‘pcl::Filter<pcl::PointXYZRGB>*’ in assignment Base::Base(pcl::Filter<pcl::PointXYZRGB> &abs_filter) { f = abs_filter; }

我做的事情哪里出错了?

非常感谢任何帮助!

您将 f 设置为指向局部变量的指针 - 这将不起作用(abs_filter 是 vg 变量的本地副本)。使用以下选项之一:

   Base::Base(pcl::Filter<pcl::PointXYZRGB>&abs_filter) { f = &abs_filter;}
   Base::Base(pcl::Filter<pcl::PointXYZRGB>*abs_filter) { f = abs_filter; }

(在 类 中有相应的变化)。

当定义一个参数按值传递的函数时,会发生这种情况

int myFun(myClass x) {
    // x exists only in this function
    // because is a copy of the argument passed to x
}

所以改变

Base(pcl::Filter<pcl::PointXYZRGB> abs_filter) { f = &abs_filter; }

Base(pcl::Filter<pcl::PointXYZRGB>& abs_filter) { f = &abs_filter; }

不是获取它的副本,而是传递值本身。