【问题标题】:Returning a pointer instance variable in C++在 C++ 中返回一个指针实例变量
【发布时间】:2020-09-25 17:22:03
【问题描述】:
我有一个带有指向另一个对象的指针的命令模式类(我们称之为 Duck)。它的子类将使用 Duck,但是为了控制和跟踪何时使用 Duck(用于调试),我将 Duck 设为私有,子类只能通过 getDuck() 方法获取它;
class Command
{
private:
Duck* target;
public:
//Parametrized Constructor
Command(Duck* _target);
Duck* getDuck() { return target; }
...
};
我最近在 Scott Myers 的 Effective C++ 中了解到返回指针的可怕之处。我尝试只返回取消引用的版本,但这会导致返回目标副本。我应该(并且有办法)简单地返回一个 Duck 对象而不是指向它的指针吗?
【问题讨论】:
标签:
c++
pointers
return
command-pattern
【解决方案1】:
从概念上讲,有两种指针:拥有和非拥有。
拥有指针表示持有对象/函数拥有分配并负责删除该对象。
非拥有指针是“借用”对象;持有对象/函数不拥有该对象,并且不负责清理它。
理想情况下,这在自 C++11 以来的 C++ 类型系统中体现为以下方式:
-
std::unique_ptr<T> 是指向 T 对象的唯一所有权指针。只有一个对象/函数可以拥有分配。
-
std::shared_ptr<T> 是指向 T 对象的共享所有权指针。许多对象/函数共享分配的所有权,并且只有在所有对象/函数都完成后才会删除目标对象。
-
T * 是一个非拥有指针。这由函数返回以指示调用者不拥有该对象。调用者不希望删除该对象;事实上,调用者可能不会删除它。一旦拥有的对象/函数破坏了目标对象,调用者就不应使用指针。
返回一个原始指针本身并没有什么错,尽管我只会在函数需要有条件地访问它拥有的对象时才返回一个指针:
-
T *:该函数正在返回一个对象的非拥有句柄,但它可能没有对象,因此可以返回 nullptr。 T * 是“可选的、非拥有的对象句柄”。
-
T &:该函数正在返回一个对象的非拥有句柄,并且它总是有这样一个对象要返回。 T & 是“强制的、非拥有的对象句柄”。
请注意,并非所有标准库设施都会遵守这些准则;确实不是所有人都可以! new T 必须返回 T *,因为这就是它的工作方式。这些是您应在您的应用程序中遵循的准则。