我有以下问题。我有一堂课,有功能
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 );
但是这不起作用(我假设您不能将一种类型的指针移动到另一种类型,即使一个指针指向的类继承自另一种)。如果有人提出任何建议,我将很高兴。
答案 0 :(得分:4)
首先考虑要实现的内容的所有权语义,并向类和函数的用户发布,然后选择适合的实现和类型。
从您的文字看来,您似乎想在您的类的对象与其用户之间共享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();
}
如果您希望所有权严格属于您的课程,则可以将其存储为unique_ptr
。然后,授予访问权限的唯一方法是返回原始指针或引用(可能更可取),但您希望使类放弃所有权的情况除外,在这种情况下,应使用move
。因此,最好不要返回共享指针,而是返回唯一的指针,这使调用者可以自由决定自己是否想要在以后共享它。在这种情况下,您将:
std::unique_ptr<DerivedInterface> m_xmlInterface;
和:
std::unique_ptr<IBaseInterface> getBaseInterface()
{
return std::move(m_xmlInterface);
}
但是,有一个很大的N.B .:在任何人调用此函数之后,您的类不再可以使用m_xmlInterface
,它失去了对它的所有所有权。