在 C++ 中返回一个指针实例变量

Returning a pointer instance variable in C++

我有一个命令模式 class,它带有指向另一个对象的指针(我们称它为 Duck)。它的 subclasses 将使用 Duck,但是为​​了控制和跟踪何时使用 Duck(用于调试)我将 Duck 设为私有并且 subclasses 只能通过方法 getDuck();

class Command
{
    private:
        Duck* target;
    public:
        //Parametrized Constructor
        Command(Duck* _target);
        Duck* getDuck() { return target; }

        ...
};

我最近在 Scott Myers 的 Effective C++ 中了解到 return 指针的可怕之处。我只尝试 return 取消引用的版本,但这导致目标副本被 return 编辑。我应该(并且有办法)简单地 return 一个 Duck 对象而不是指向它的指针吗?

从概念上讲,有两种指针:拥有和非拥有。

拥有指针表示持有 object/function 拥有分配并负责删除对象。

非拥有指针是一个"borrowed"对象;持股 object/function 拥有该对象, 负责清理它。

理想情况下,这在 C++11 之后的 C++ 类型系统中以下列方式体现:

  • std::unique_ptr<T> 是指向 T 对象的唯一所有权指针。只有一个 object/function 可以拥有分配。
  • std::shared_ptr<T> 是指向 T 对象的共享所有权指针。许多 objects/functions 共享分配的所有权,目标对象只有在所有对象都完成后才会被删除。
  • T * 是一个非拥有指针。这是由函数 return 编辑的,以指示调用者 拥有该对象。调用者 应该删除该对象;实际上,调用者 可能不会 删除它。一旦拥有 object/function 销毁目标对象,调用者就不应使用该指针。

使用原始指针 return 本质上没有错,尽管我只会 return 当函数需要有条件地访问它拥有的对象时使用指针:

  • T *:该函数是 return 对象的非拥有句柄,但它可能没有对象,所以 return nullptrT * 是 "optional, non-owning object handle."
  • T &: 函数是return一个对象的非拥有句柄,它总是有这样一个对象到return。 T & 是 "mandatory, non-owning object handle."

请注意,并非所有标准图书馆设施都会遵守这些准则;确实不是所有人都可以! new T 必须 return a T * 因为这就是它定义的工作方式。这些是您的申请中应遵循的准则。