在C ++中将shared_ptr返回给基类

时间:2018-08-16 21:02:51

标签: c++

我有以下问题。我有一堂课,有功能

std::shared_ptr<IBaseInterface> getBaseInterface()
   {
      return m_spBase;
   }

我还有以下内容:

private:

   std::shared_ptr<IBaseInterface> m_spBase;

   XMLReader* m_xmlReader;

   std::unique_ptr<DerivedInterface> m_xmlInterface;

这里的事情是DerivedInterface继承自IBaseInterface,所以从外面看,它应该显示为IBaseInterface。我还应该提到,m_xmlInterface在这里不必是一个指针(唯一/不唯一)。另外,DerivedInterface是一个具体的类,它具有以下构造函数(对于我的问题,这可能不太重要):

   DerivedInterface( XMLReader* pxmlReader );

IBaseInterface只是一个纯抽象类,它具有DerivedInterface定义的一些纯虚函数。

现在,我想创建一个DerivedInterface实例,并使用getBaseInterface将其返回为IBaseInterface,这是我的主要观点。我尝试在类的构造函数中执行以下操作:

m_xmlInterface = std::unique_ptr<DerivedInterface>(
     new DerivedInterface( m_xmlReader ) );

  m_spBase = std::move( m_xmlInterface );

但是这不起作用(我假设您不能将一种类型的指针移动到另一种类型,即使一个指针指向的类继承自另一种)。如果有人提出任何建议,我将很高兴。

1 个答案:

答案 0 :(得分:4)

首先考虑要实现的内容的所有权语义,并向类和函数的用户发布,然后选择适合的实现和类型。

  1. 从您的文字看来,您似乎想在您的类的对象与其用户之间共享m_xmlInterface的所有权。这意味着,如果用户获得了该接口,则当您的类的对象消失时,它仍然拥有该接口。在这种情况下,您应该将其存储为类中的共享指针,并将其也返回为共享指针。在这种情况下,您将:

    std::shared_ptr<DerivedInterface> m_xmlInterface;
    

    和:简单地:

    std::shared_ptr<IBaseInterface> getBaseInterface()
    {
      return m_xmlInterface;
    }
    

    无需遍历另一个变量。这是显示此工作的完整示例:

    #include <memory>
    
    struct A {};
    struct B : public A {};
    
    class Foo {
    public:
      Foo() {}
      std::shared_ptr<A> get() { return mB; }
    private:
      std::shared_ptr<B> mB;
    };
    
    int main() {
      auto foo = Foo{};
      auto a = foo.get();
    }
    
  2. 如果您希望所有权严格属于您的课程,则可以将其存储为unique_ptr。然后,授予访问权限的唯一方法是返回原始指针或引用(可能更可取),但您希望使类放弃所有权的情况除外,在这种情况下,应使用move。因此,最好不要返回共享指针,而是返回唯一的指针,这使调用者可以自由决定自己是否想要在以后共享它。在这种情况下,您将:

    std::unique_ptr<DerivedInterface> m_xmlInterface;
    

    和:

    std::unique_ptr<IBaseInterface> getBaseInterface()
    {
      return std::move(m_xmlInterface);
    }
    

    但是,有一个很大的N.B .:在任何人调用此函数之后,您的类不再可以使用m_xmlInterface,它失去了对它的所有所有权。