2015-08-14 309 views
2

以下结构应该将shared_ptr保存到抽象基类(Shape)。但是,当我尝试写这个,我得到error C2065: 'Shape' : undeclared identifiershared_ptr抽象基类(成员变量)是一个未声明的标识符

所以我知道我不能创建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结构,反之亦然。

+0

我猜这个问题可能是'shape.hpp'。 – Galik

+0

我打赌一个'shape.hpp'包含'hit.hpp'的韭菜。 – Quentin

+0

@Quentin这是正确的。两个文件确实包含对方。 – kleinfreund

回答

4

在上述替换#include "shape.hpp"向前declaratioň

class Shape;(您可能需要struct Shape;根据Shape如何申报)。

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

这可以帮助您解开圆形包裹物。当然,定义struct Hit功能的源文件将需要#includeshape.hpp

+0

如果只有'hit.hpp'而没有cpp文件(只有构造函数和成员声明),我是否会离开'#include“shape.hpp”'或我介绍一个cpp文件? – kleinfreund

+0

为了简单生活,请介绍一个'.cpp'文件。 – Bathsheba

+0

如果您有hpp和cpp文件对,源文件将更具可读性...... –