所以我正在破解我的代码,试图使用 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 会同时破坏接口(interface)和 CEngineLayer 吗?)

最佳答案

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

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



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

关于inheritance - shared_ptr 返回一个接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4426718/

10-11 22:46
查看更多