提问者:小点点

在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++中了解了返回指针的可怕之处。 我尝试只返回取消引用的版本,但这导致返回了target的副本。 我是否应该(以及有没有方法)简单地返回一个Duck对象而不是指向它的指针?


共1个答案

匿名用户

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

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

非所有者指针是“借用”对象; 持有对象/函数不拥有该对象,也不负责清理该对象。

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

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

返回原始指针本身并没有什么问题,不过我只会在函数需要有条件地访问它拥有的对象时返回指针:

  • T*:该函数将向对象返回一个非所有者句柄,但它可能没有对象,因此可以返回NullptrT*是“可选的,非所有者对象句柄。”
  • t&:函数返回一个对象的非所有者句柄,它将始终返回这样一个对象。 t&是“强制的,非所有者对象句柄。”

请注意,并非所有标准图书馆设施都将遵守这些准则; 的确不是所有人都能做到! 新T必须返回一个T*,因为这是定义它的工作方式。 这些是您在应用程序中应该遵循的指导原则。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|返回|指针|实例|变量)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?