我正在使用从基类继承的抽象类型的指针。
目前,每个子类必须在其构造函数中包含以下行为:
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; }
我在做什么我错了?
非常感谢任何帮助!
答案 0 :(得分:1)
您将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; }
(在课程中有相应的变化)。
答案 1 :(得分:1)
当定义具有通过值传递的参数的函数时,会发生这种情况
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; }
不要获取它的副本,以传递值本身。