shared_ptr返回一个接口

时间:2010-12-13 07:44:52

标签: inheritance interface c++11 shared-ptr

所以我正在破坏我的代码,尝试使用GCC 4.5将其转换为一些不太合适的C ++ 0x代码。

shared_ptr<IEngineLayer*> createEngineLayer(void)
{
    try
    {
        CEngineLayer* engine = new CEngineLayer;
        IEngineLayer* interface = dynamic_cast<IEngineLayer*>(engine);

        return shared_ptr<IEngineLayer*>(interface);
    }
    catch(std::bad_alloc&)
    {
        // Unable to allocate enough memory for the engine layer.
        return shared_ptr<IEngineLayer*>();
    }
}

我得到了这个......

  

shared_ptr_base.h:545:65:错误:初始化时无法将'DEngine :: IEngineLayer *'转换为'DEngine :: IEngineLayer **'

我该如何解决这个问题?

(另外,作为旁注,当没有人再使用它时,shared_ptr会破坏接口和CEngineLayer吗?)

3 个答案:

答案 0 :(得分:4)

shared_ptr<T>模拟指向T的指针,shared_ptr<T *>模拟指向T指针的指针。

假设CEngineLayerIEngineLayer,您可以将代码更改为:

shared_ptr<IEngineLayer> createEngineLayer()
{
    try
    {
        return shared_ptr<IEngineLayer>(new CEngineLayer);
    }
    catch(const std::bad_alloc&)
    {
        // Unable to allocate enough memory for the engine layer.
        return shared_ptr<IEngineLayer>();
    }
}

另请注意,“派生到基础”转换不需要显式转换:如果CEngineLayerIEngineLayer公开继承,则指向CEngineLayer的指针可以隐式转换为指针到IEngineLayer

  

另外,作为旁注,将是shared_ptr   破坏界面和界面   当没有人使用它时,CEngineLayer   了吗?

有一个类型为CEngineLayer的对象,如果IEngineLayer中的析构函数是虚拟的(它应该是),则当引用计数达到0时将被正确销毁。

答案 1 :(得分:2)

改为shared_ptr<IEngineLayer>

也不需要演员:

shared_ptr<IEngineLayer> createEngineLayer()
{
    try
    {
        CEngineLayer* engine = new CEngineLayer;

        return shared_ptr<IEngineLayer>(engine);
    }
    catch(std::bad_alloc&)
    {
        // Unable to allocate enough memory for the engine layer.
        return shared_ptr<IEngineLayer>();
    }
}

答案 2 :(得分:0)

你也可以使用make_shared,这更好地从性能角度来看:

std::shared_ptr<IEngineLayer> createEngineLayer(void)
{
    return std::make_shared<CEngineLayer>();
}

以下代码也会造成内存泄漏:

std::shared_ptr<IEngineLayer> createEngineLayer(void)
{
    IEngineLayer* pInterface = new CEngineLayer;

    return std::shared_ptr<IEngineLayer>(pInterface);
}

在这种情况下,shared_ptr删除IEngineLayer而不删除CEngineLayer