从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这与切片无关:切片是指将派生类的实例复制到基类的实例中,从而丢失派生部分。这里不涉及切片。