C++ 这是对unique_ptr的滥用吗?

C++ 这是对unique_ptr的滥用吗?,c++,c++11,c++14,C++,C++11,C++14,我正在向智能指针转变,我正在努力确保正确使用它们。有很多问题涉及何时使用每一个,但我没有找到一个关于getters的问题 我有一个拥有指针的类,我希望其他类能够访问该指针(分步重构遗留代码)。我想给这个类一个唯一的ptr,因为它只拥有那个对象,但它们不能被复制。我应该返回对唯一的\u ptr的引用,还是只使用共享的\u ptr class B { public: doAction() {}; }; class A { private: std::unqiue_ptr<

我正在向智能指针转变,我正在努力确保正确使用它们。有很多问题涉及何时使用每一个,但我没有找到一个关于getters的问题

我有一个拥有指针的类,我希望其他类能够访问该指针(分步重构遗留代码)。我想给这个类一个唯一的ptr,因为它只拥有那个对象,但它们不能被复制。我应该返回对唯一的\u ptr的引用,还是只使用共享的\u ptr

class B
{
 public:
    doAction() {};
};

class A
{
 private:
    std::unqiue_ptr<B> pointer;

 public:
    std::unique_ptr<B>& GetPointer()
    {
        return pointer;
    }

};

a.GetPointer()->doAction();
B类
{
公众:
doAction(){};
};
甲级
{
私人:
std::unqiue_ptr指针;
公众:
std::unique_ptr&GetPointer()
{
返回指针;
}
};
a、 GetPointer()->doAction();

如果其他类需要存储指针,并且可能比您的类A的寿命更长,请使用
共享\u ptr

如果不是,那么销毁A时应该销毁
B
对象,这是对
unique\u ptr
的完全有效的使用

正如注释中所指出的,只有当其他类也被允许更改指针时,这才成立。如果不是,则返回一个原始指针


两者之间的区别不在于谁有权访问该类,而在于谁负责销毁引用的对象。

如果代码只需要通过unique_ptr访问
B
对象,那么最好只返回带有
pointer.get()的原始指针。记住,原始指针不是坏事,拥有原始指针才是坏事

我应该返回对唯一的\u ptr的引用,还是只使用共享的\u ptr

class B
{
 public:
    doAction() {};
};

class A
{
 private:
    std::unqiue_ptr<B> pointer;

 public:
    std::unique_ptr<B>& GetPointer()
    {
        return pointer;
    }

};

a.GetPointer()->doAction();
视情况而定

指针是否需要其他东西来拥有?如果是,则使用共享所有权。如果您不需要共享所有权,则
A
可以是唯一所有者,因此
unique\u ptr
是合适的


但是在这种情况下,我会返回一个对对象的引用(或者一个原始指针,如果
unique\u ptr
可能为空),而不是
unique\u ptr
。它封装了所有权的控制,因此只能在成员函数中更改所有权。如果您有一个函数返回对
unique\u ptr
的引用,那么您就没有封装,为了简单起见,您最好首先将
unique\u ptr
公开。

返回一个原始指针或指向的对象的引用。当对象持有
std::unique\u ptr
时,这表示所有权。这意味着,持有指针的对象将在它愿意的时候分配并删除分配的资源

例如:

class Car {
public:
  Engine* getEngine() const { return engine_.get(); }
private:
  std::unique_ptr<Engine> engine_;
}
等级车{
公众:
Engine*getEngine()常量{return Engine_u2;.get();}
私人:
std::独特的ptr引擎;
}

您可能会要求提供汽车可能的发动机,您应该始终假设它可能不在那里,但您绝对不应该取消分配它,它不是您的,它是汽车所有的。

就个人而言,我使用原始指针或参考来进行非所有权访问。(如果允许值为null,则使用指针;否则使用引用)这将允许调用方执行
a.GetPointer().reset()可能不是您想要的。最好让
GetPointer()
返回原始指针,如
returnpointer.get()
或返回一个引用,这也表示没有返回“所有权”:
B&getbreeference(){return*pointer;}