所以我正在破解我的代码,试图使用 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
的指针。
假设 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
的指针。有一个类型为
CEngineLayer
的对象,如果 IEngineLayer
中的析构函数是虚拟的(它应该是),当引用计数达到 0 时,它将被正确地销毁。关于inheritance - shared_ptr 返回一个接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4426718/