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

C++ 通过C+;中的构造函数将地址参数传递给基类指针+;,c++,inheritance,constructor,compiler-errors,point-cloud-library,C++,Inheritance,Constructor,Compiler Errors,Point Cloud Library,我使用的是从基类继承的抽象类型指针 目前,每个子类必须在其构造函数中包含以下行为: 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_

我使用的是从基类继承的抽象类型指针

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

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) { }
当然,我希望将这种行为提升到基类,但我很难做到这一点。我不确定这是否是由于我如何声明类型,或者是否需要更改实现以反映行为的变化(或其他!)

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

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) { }
我现在做的事情哪里出错了


非常感谢您的帮助

您正在将f设置为指向局部变量的指针-这将不起作用(abs\U筛选器是vg变量的局部副本)。使用以下选项之一:

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; }
   Base::Base(pcl::Filter<pcl::PointXYZRGB>&abs_filter) { f = &abs_filter;}
   Base::Base(pcl::Filter<pcl::PointXYZRGB>*abs_filter) { f = abs_filter; }
Base::Base(pcl::Filter&abs\u Filter){f=&abs_ufilter;}
Base::Base(pcl::Filter*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 abs_Filter){f=&abs_Filter;}

Base(pcl::Filter&abs_Filter){f=&abs_Filter;}

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

正如旁注
abs\u filter
过滤器的函数本地副本,仅存在于构造函数的范围内。在
f
中存储一个指向该变量地址的指针将在您离开构造函数时留下一个悬空指针。如果您的成员是指针,那么您应该使用指针。这意味着
Base(pcl::Filter abs\u Filter);=>底座(pcl::过滤器*abs_过滤器)
Hi@CoryKramer,只有使用f的方法在基类中定义,然后由子类继承。这种方法不好吗?您好,NathanOliver,那么我应该像以前一样,先取一个指针,然后使用指针的地址(
&pointer
),谢谢您的解释。我只是想知道双重使用
&
时这里的语法(我正在一点一点地了解它)。如果参数是
pcl::Filter&abs\u Filter
,那么我认为变量
abs\u Filter
将是值?或者变量
&abs\u filter
?您将
f
清除为指针,因此必须使用
运算符引用
abs\u filter
,因为它是未引用的对象。