如何使用抽象类型的 C++ 指针指向具体类?

Posted

技术标签:

【中文标题】如何使用抽象类型的 C++ 指针指向具体类?【英文标题】:How to use a C++ pointer of abstract type to point to a concrete class? 【发布时间】:2017-04-18 17:49:04 【问题描述】:

我正在使用Point Cloud Library,并试图避免重复以下行为:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr filter(PointCloud<pcl::PointXYZRGB>::Ptr input_cloud) 
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);
    subclass.setInputCloud(input_cloud);
    subclass.filter(*cloud_filtered);
    return cloud_filtered;

我希望使用基于 example 的东西,并遵循以下原则:

pcl::Filter<PointXYZRGB>* f;
pcl::Subclass<PointXYZRGB> s; //where s is an implementation of f
f = &s;

pcl::PointCloud<pcl::PointXYZRGB>::Ptr filter(PointCloud<pcl::PointXYZRGB>::Ptr input_cloud) 
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);
    f->setInputCloud(input_cloud);
    f->filter(*cloud_filtered);
    return cloud_filtered;

但是,这不会编译为编译器报告的f does not name a type

我认为这是因为 pcl::Filter 是一个抽象类吗?

这种方法对pcl::VoxelGrid 等示例类有效还是有替代方法?

非常感谢任何帮助!

【问题讨论】:

我闻到了missing typename 你想在函数之外做f = &amp;s;吗? 通常当编译器找不到类时会出现此错误,对我来说将 f 作为抽象类是很正常的,我认为问题出在包含或类似的东西上,是你确定你的包含在正确的地方吗? 是的!我没有意识到这在函数之外是非法的。我不是 C++ 学者,所以对此我深表歉意。我将f = &amp;s; 放入构造函数中,它按预期工作。非常感谢大家。 @aschepler 【参考方案1】:

f = &amp;s; 行应移至函数内。

在这种情况下,它被移到派生子类的构造函数中。

感谢用户 aschepler 的回答

【讨论】:

以上是关于如何使用抽象类型的 C++ 指针指向具体类?的主要内容,如果未能解决你的问题,请参考以下文章

如何从指向基类类型的指针调用派生类函数(C++)

如何使 const 适用于作为共享指针的 C++ 类成员

抽象类指针

如何使函数返回指向函数的指针? (C++)

指向 C++ 类的 C 结构指针

指向抽象类的指针