从C++类返回SyrdPPTR
我有一个问题与从类返回共享指针有关。 我班上的一部分学生是这样的:从C++类返回SyrdPPTR,c++,C++,我有一个问题与从类返回共享指针有关。 我班上的一部分学生是这样的: typedef std::shared_ptr<IBaseInterface> IBaseInterfaceSP; ... IBaseInterfaceSP getMyInterface() { m_spBase = std::make_shared<IBaseInterfaceSP>( m_derivedInterface); return m_spBase; }
typedef std::shared_ptr<IBaseInterface> IBaseInterfaceSP;
...
IBaseInterfaceSP getMyInterface()
{
m_spBase = std::make_shared<IBaseInterfaceSP>( m_derivedInterface);
return m_spBase;
}
IBaseInterfaceSP getInterface()
{
if (!m_spBase)
{
m_spBase= std::make_shared<IBaseInterface>( m_derivedInterface );
}
return m_spBase;
}
此外,DerivedInterface继承自IBaseInterfaceSP
getInterface是我的类的一个公共函数
这是从我的类返回指针的正确方法吗?切片或类似的东西会有什么问题吗
另外,如果有不清楚的地方,我很抱歉,我不允许公开发布所有代码,只有部分代码,如果是,请告诉我。我可以看到此代码存在一些问题 一,。延迟初始化 每次调用getInterface时,都会创建IBaseInterface类的新实例。作为您的类的用户,我不希望这种行为发生在名为get的方法中 我猜您希望实现延迟初始化,在这种情况下,您可以这样做:
typedef std::shared_ptr<IBaseInterface> IBaseInterfaceSP;
...
IBaseInterfaceSP getMyInterface()
{
m_spBase = std::make_shared<IBaseInterfaceSP>( m_derivedInterface);
return m_spBase;
}
IBaseInterfaceSP getInterface()
{
if (!m_spBase)
{
m_spBase= std::make_shared<IBaseInterface>( m_derivedInterface );
}
return m_spBase;
}
四,。切片
这里确实发生了分裂。这一行:
m_spBase=std::make_共享m_derivedInterface
实际扩展为包含与以下内容等效的内容的代码:
auto newInstance=新的IBaseInterfacem\u derivedInterface
反过来,上面的行将调用IBaseInterface类的复制构造函数,其签名类似于:
iBaseInterface iBaseInterface&其他
因此,m_derivedInterface在该调用的上下文中被解释为IBaseInterface引用。因此,在调用new期间,只有IBaseInterface的成员会被复制,从而丢失派生类DerivedInterface中存储的所有信息
综上所述,在我看来,您真正想要的是直接访问m_derivedInterface对象。现在要做的是,将实例复制到另一个对象中,然后返回新对象。我想你真正想要的是:
IBaseInterface* getInterface()
{
return &m_derivedInterface;
}
如果坚持使用共享所有权,只需存储指向m_derivedInterface的共享指针,而不是值:
MyClass(Args args)
{
m_derivedInterface.reset(new DerivedInterface(args));
}
std::shared_ptr<IBaseInterface> getInterface()
{
return m_derivedInterface;
}
std::shared_ptr<IBaseInterface> m_derivedInterface;
我可以看到这个代码有几个问题 一,。延迟初始化 每次调用getInterface时,都会创建IBaseInterface类的新实例。作为您的类的用户,我不希望这种行为发生在名为get的方法中 我猜您希望实现延迟初始化,在这种情况下,您可以这样做:
typedef std::shared_ptr<IBaseInterface> IBaseInterfaceSP;
...
IBaseInterfaceSP getMyInterface()
{
m_spBase = std::make_shared<IBaseInterfaceSP>( m_derivedInterface);
return m_spBase;
}
IBaseInterfaceSP getInterface()
{
if (!m_spBase)
{
m_spBase= std::make_shared<IBaseInterface>( m_derivedInterface );
}
return m_spBase;
}
四,。切片
这里确实发生了分裂。这一行:
m_spBase=std::make_共享m_derivedInterface
实际扩展为包含与以下内容等效的内容的代码:
auto newInstance=新的IBaseInterfacem\u derivedInterface
反过来,上面的行将调用IBaseInterface类的复制构造函数,其签名类似于:
iBaseInterface iBaseInterface&其他
因此,m_derivedInterface在该调用的上下文中被解释为IBaseInterface引用。因此,在调用new期间,只有IBaseInterface的成员会被复制,从而丢失派生类DerivedInterface中存储的所有信息
综上所述,在我看来,您真正想要的是直接访问m_derivedInterface对象。现在要做的是,将实例复制到另一个对象中,然后返回新对象。我想你真正想要的是:
IBaseInterface* getInterface()
{
return &m_derivedInterface;
}
如果坚持使用共享所有权,只需存储指向m_derivedInterface的共享指针,而不是值:
MyClass(Args args)
{
m_derivedInterface.reset(new DerivedInterface(args));
}
std::shared_ptr<IBaseInterface> getInterface()
{
return m_derivedInterface;
}
std::shared_ptr<IBaseInterface> m_derivedInterface;
对我来说似乎有点破碎。为什么m_xmlInterface本身不是类中的IConfigInterfaceSP?这就使得有两个不同的所有者负责删除同一个对象。关于PrxScript:我们的C++社区一般不想要更多的代码,但更少。当你等待答案时,考虑阅读;我不知道你想做什么-这是某种缓存/延迟初始化,你想在内部存储m_spConfig并返回它(如果它存在的话)——这不是代码当前正在做的,但对我来说有点像敲钟?或者完全是别的什么。编写的代码应该可以工作,但是对getInterface的任何后续调用都将构造一个新的IConfiginInterface,这似乎不太可能达到预期的效果。这确实是切分的——每次调用函数时,您都从m_xmlInterface创建一个新的IConfiginInterface,放弃了前一个IConfiginInterface的所有权。我猜这不是您想要的,但我也猜不出您想要的是什么。@molbdnilo这与切片无关:切片是指将派生类的实例复制到基类的实例中,从而丢失派生部分。这里没有切片,我觉得有点破碎。为什么m_xmlInterface本身不是类中的IConfigInterfaceSP?这就使得有两个不同的所有者负责删除同一个对象。关于PrxScript:我们的C++社区一般不想要更多的代码,但更少。当你在等answe的时候
R,考虑阅读;我不知道你想做什么-这是某种缓存/延迟初始化,你想在内部存储m_spConfig并返回它(如果它存在的话)——这不是代码当前正在做的,但对我来说有点像敲钟?或者完全是别的什么。编写的代码应该可以工作,但是对getInterface的任何后续调用都将构造一个新的IConfiginInterface,这似乎不太可能达到预期的效果。这确实是切分的——每次调用函数时,您都从m_xmlInterface创建一个新的IConfiginInterface,放弃了前一个IConfiginInterface的所有权。我猜这不是您想要的,但我也猜不出您想要的是什么。@molbdnilo这与切片无关:切片是指将派生类的实例复制到基类的实例中,从而丢失派生部分。这里不涉及切片。