首页 > 解决方案 > 在 C++ 中返回一个指针实例变量

问题描述

我有一个带有指向另一个对象的指针的命令模式类(我们称之为 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++pointersreturncommand-pattern

解决方案


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

拥有指针指示持有对象/函数拥有分配并负责删除该对象。

非拥有指针是“借来的”对象;持有对象/功能不拥有该对象,也不负责清理它。

理想情况下,这在自 C++11 以来的 C++ 类型系统中通过以下方式表现出来:

  • std::unique_ptr<T>是指向T对象的唯一所有权指针。恰好一个对象/函数可以拥有分配。
  • std::shared_ptr<T>是指向T对象的共享所有权指针。许多对象/函数共享分配的所有权,只有当所有对象/函数都完成后,目标对象才会被删除。
  • T *是一个非拥有指针。这由函数返回以指示调用者拥有该对象。调用者应该删除对象;事实上,调用者可能不会删除它。一旦拥有的对象/函数破坏了目标对象,调用者就不会使用指针。

返回原始指针本身并没有错,尽管我只会在函数需要有条件地访问它拥有的对象时才返回指针:

  • T *:该函数正在返回一个对象的非拥有句柄,但它可能没有对象,因此可以返回nullptrT *是“可选的、非拥有的对象句柄”。
  • T &:该函数正在返回一个对象的非拥有句柄,并且它总是有这样一个对象要返回。 T &是“强制的、非拥有的对象句柄”。

请注意,并非所有标准库设施都会遵守这些准则;确实不是所有人都可以! new T必须返回 a T *,因为它是这样定义的。这些是您在应用程序中应遵循的准则。


推荐阅读