【发布时间】:2017-04-24 11:33:43
【问题描述】:
我正在使用从基类继承的抽象类型的指针。
目前,每个子类都必须在其构造函数中包含以下行为:
p = &f; //where p is the inherited pointer and f is the subclass filter
当然,我希望将此行为移至基类,但我正在努力完成这项工作。我不确定这是否是由于我声明类型的方式,或者我是否需要更改实现以反映行为的移动(或其他东西!)。
我基本上试图复制这一行并通过子类构造函数调用基本构造函数:
//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; }
我做错了什么?
非常感谢任何帮助!
【问题讨论】:
-
就像旁注一样
abs_filter是您的Filter的函数本地副本,它只存在于您的构造函数范围内。将指向该变量地址的指针存储在f中会在您离开构造函数后立即给您留下一个悬空指针。 -
如果您的成员是指针,那么您应该使用指针。这意味着
Base(pcl::Filter<pcl::PointXYZRGB> abs_filter); => Base(pcl::Filter<pcl::PointXYZRGB>* abs_filter); -
嗨@CoryKramer,唯一使用 f 的方法在基类中定义,然后由子类继承。这种方法不好吗?
-
嗨@NathanOliver,我是否像以前一样接收一个指针,然后使用指针的地址(
&pointer)?
标签: c++ inheritance constructor compiler-errors point-cloud-library