Inheritance 返回接口的共享\u ptr
因此,我正在黑客攻击我的代码,试图使用GCC4.5将其转换成一些半正常的C++0x代码Inheritance 返回接口的共享\u ptr,inheritance,interface,c++11,shared-ptr,Inheritance,Interface,C++11,Shared Ptr,因此,我正在黑客攻击我的代码,试图使用GCC4.5将其转换成一些半正常的C++0x代码 shared_ptr<IEngineLayer*> createEngineLayer(void) { try { CEngineLayer* engine = new CEngineLayer; IEngineLayer* interface = dynamic_cast<IEngineLayer*>(engine);
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 createEngineLayer(无效)
{
尝试
{
CEngineLayer*引擎=新的CEngineLayer;
IEngineLayer*接口=动态投影(引擎);
返回共享ptr(接口);
}
捕获(标准::错误分配&)
{
//无法为引擎层分配足够的内存。
返回共享_ptr();
}
}
我明白了
shared_ptr_base.h:545:65:错误:无法在初始化中将“DEngine::IEngineLayer*”转换为“DEngine::IEngineLayer**”
我怎样才能解决这个问题
(另外,作为旁注,当没有人再使用它时,共享\u ptr是否会破坏接口和CEngineLayer?返回一个共享\u ptr
也不需要演员阵容:
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>();
}
}
shared_ptr createEngineLayer()
{
尝试
{
CEngineLayer*引擎=新的CEngineLayer;
返回共享的ptr(引擎);
}
捕获(标准::错误分配&)
{
//无法为引擎层分配足够的内存。
返回共享_ptr();
}
}
Ashared\u ptr
为指向T
的指针建模,Ashared\u ptr
为指向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>();
}
}
shared_ptr createEngineLayer()
{
尝试
{
返回共享ptr(新层);
}
捕获(const std::bad_alloc&)
{
//无法为引擎层分配足够的内存。
返回共享_ptr();
}
}
还请注意,“派生到基本”转换不需要显式强制转换:如果CEngineLayer
公开继承自IEngineLayer
,则指向CEngineLayer
的指针可以隐式转换为指向IEngineLayer
的指针
另外,作为旁注,将共享
销毁接口和
当没有人使用它时,请使用它
还有吗
有一个类型为
CEngineLayer
的对象,如果IEngineLayer
中的析构函数是虚拟的(并且应该是虚拟的),那么当引用计数达到0时,该对象将被正确销毁。您也可以使用make_shared,从性能角度来看,这是更好的:
std::shared_ptr<IEngineLayer> createEngineLayer(void)
{
return std::make_shared<CEngineLayer>();
}
std::shared_ptr createEngineLayer(无效)
{
返回std::make_shared();
}
以下代码也可能导致内存泄漏:
std::shared_ptr<IEngineLayer> createEngineLayer(void)
{
IEngineLayer* pInterface = new CEngineLayer;
return std::shared_ptr<IEngineLayer>(pInterface);
}
std::shared_ptr createEngineLayer(无效)
{
IEngineLayer*pInterface=新的CEngineLayer;
返回std::shared_ptr(pInterface);
}
在这种情况下,shared_ptr会删除一个IEngineLayer而不是CEngineLayer谢谢,我遵循了其他STD容器(如vector)的思路,而不是记住它是一个指针。感谢您提供的单一对象信息。