在 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 nullptr
。 T *
是 "optional, non-owning object handle."
T &
: 函数是return一个对象的非拥有句柄,它总是有这样一个对象到return。 T &
是 "mandatory, non-owning object handle."
请注意,并非所有标准图书馆设施都会遵守这些准则;确实不是所有人都可以! new T
必须 return a T *
因为这就是它定义的工作方式。这些是您在您的申请中应遵循的准则。
我有一个命令模式 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 对象的非拥有句柄,但它可能没有对象,所以 returnnullptr
。T *
是 "optional, non-owning object handle."T &
: 函数是return一个对象的非拥有句柄,它总是有这样一个对象到return。T &
是 "mandatory, non-owning object handle."
请注意,并非所有标准图书馆设施都会遵守这些准则;确实不是所有人都可以! new T
必须 return a T *
因为这就是它定义的工作方式。这些是您在您的申请中应遵循的准则。