gpt4 book ai didi

c++ - 将 shared_ptr 返回到 C++ 中的基类

转载 作者:行者123 更新时间:2023-11-27 22:37:54 30 4
gpt4 key购买 nike

我有以下问题。我有一个类,它有这个功能

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. 从您所写的内容来看,您似乎希望在类的对象和类的用户之间共享 m_xmlInterface 的所有权。意思是,如果用户获得了接口(interface),那么当你的类的对象消失时,它仍然拥有它。在这种情况下,您应该将它作为共享指针存储在您的类中,并将它也作为共享指针返回。在这种情况下,您将:

    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);
    }

    无论如何注意:在任何人调用此函数后,您的类将无法再使用 m_xmlInterface,它失去了它的所有所有权。

关于c++ - 将 shared_ptr 返回到 C++ 中的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885306/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com