通过 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; }
不是获取它的副本,而是传递值本身。
我正在使用从基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; }
不是获取它的副本,而是传递值本身。