2015-08-14 78 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文件對,源文件將更具可讀性...... –