shared_ptr 到抽象基类(成员变量)是一个未声明的标识符[重复]

Posted

技术标签:

【中文标题】shared_ptr 到抽象基类(成员变量)是一个未声明的标识符[重复]【英文标题】:shared_ptr to abstract base class (member variable) is a an undeclared identifier [duplicate] 【发布时间】:2015-08-14 15:55:03 【问题描述】:

以下结构应包含一个指向抽象基类 (Shape) 的 shared_ptr。但是,当我尝试写这篇文章时,我得到了error C2065: 'Shape' : undeclared identifier

所以我知道我不能创建 Shape 的实例,只能创建派生的 Spheres、Boxes 等实例。但是为什么我不能将 shared_ptr 用于抽象基类?

#include <memory>  // std::shared_ptr

#include "shape.hpp"

struct Hit 
    // …

    std::shared_ptr<Shape> m_shape;  // Shape that was hit
;

需要注意的是,Shape 类确实使用了 Hit 结构,反之亦然。

【问题讨论】:

我猜问题可能出在shape.hpp 我敢打赌shape.hpp 包括hit.hpp @Quentin 这是正确的。两个文件确实相互包含。 今晚在窗台上留个韭菜;) 【参考方案1】:

将上面的#include "shape.hpp"替换为转发声明n

class Shape;(您可能需要struct Shape;,具体取决于Shape 的声明方式)。

这是可能的,因为std::shared_ptr 类型的类成员可以用不完整类型声明。

这可以帮助您解开圆形夹杂物。当然,为struct Hit定义函数的源文件需要#includeshape.hpp

【讨论】:

在只有hit.hpp没有cpp文件的情况下(只有构造函数和成员声明),我是离开#include "shape.hpp"还是引入cpp文件? 为了轻松生活,请引入.cpp 文件。 当您拥有 hpp 和 cpp 文件对时,源代码将更具可读性...

以上是关于shared_ptr 到抽象基类(成员变量)是一个未声明的标识符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

抽象基类中初始化const成员变量的常用解决方案

使用 boost::shared_ptr 访问静态成员变量

从基类指针访问两个具有不同类型的派生成员变量。

具有数据成员的抽象基类

识别已将哪个基类 shared_ptr 传递到超类 shared_ptr 向量中

使用shared_ptr将基类引用值复制到映射