Shared_ptr returns an interface

So, I crack my code trying to turn it into some kind of semi-decent C ++ 0x code using GCC 4.5.

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*>();
    }
}

And I understand that.

shared_ptr_base.h: 545: 65: error: cannot convert 'DEngine :: IEngineLayer * to' DEngine :: IEngineLayer ** on initialization

How can i fix this?

(Also, as a side note, shared_ptr will destroy both interfaces and CEngineLayer when no one else uses it?)

+3
source share
3 answers

A shared_ptr<T>models a pointer to T, a shared_ptr<T *>models a pointer to a pointer to T.

, CEngineLayer IEngineLayer, :

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>();
    }
}

, " " : CEngineLayer IEngineLayer, CEngineLayer IEngineLayer.

, , shared_ptr , CEngineLayer, ?

, CEngineLayer, , IEngineLayer ( ), , 0.

+4

a 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

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

0

Source: https://habr.com/ru/post/1779956/


All Articles