【问题标题】:Pass address parameter to base class pointer via constructors in C++通过 C++ 中的构造函数将地址参数传递给基类指针
【发布时间】: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&lt;pcl::PointXYZRGB&gt; &amp;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&lt;pcl::PointXYZRGB&gt; abs_filter); =&gt; Base(pcl::Filter&lt;pcl::PointXYZRGB&gt;* abs_filter);
  • 嗨@CoryKramer,唯一使用 f 的方法在基类中定义,然后由子类继承。这种方法不好吗?
  • 嗨@NathanOliver,我是否像以前一样接收一个指针,然后使用指针的地址(&amp;pointer)?

标签: c++ inheritance constructor compiler-errors point-cloud-library


【解决方案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; }

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

【讨论】:

  • 感谢您的解释。我只是想知道这里的语法(我正在一点一点地加快速度)与&amp; 的双重使用。如果参数是pcl::Filter&lt;pcl::PointXYZRGB&gt;&amp; abs_filter,那么我认为变量abs_filter 会是值吗?还是变量&amp;abs_filter
  • 您将f 取消为指针,因此您必须使用&amp; 运算符引用abs_filter,因为它是一个取消引用的对象。
【解决方案2】:

您将 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; }

(相应的类变化)。

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 2020-01-09
    • 2022-01-21
    • 2023-03-22
    • 2023-04-04
    • 2015-10-11
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多