我有一个命令模式类,它有一个指向另一个对象的指针(让我们称之为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对象而不是指向它的指针?
从概念上讲,有两种指针:拥有的和非拥有的。
一个拥有指针指示持有对象/函数拥有该分配,并负责删除该对象。
非所有者指针是“借用”对象; 持有对象/函数不拥有该对象,也不负责清理该对象。
理想情况下,这在自C++11以来的C++类型系统中以以下方式体现:
std::unique_ptr
是指向t
对象的唯一所有权指针。 只有一个对象/函数可以拥有分配。std::shared_ptr
是指向t
对象的共享所有权指针。 许多对象/函数共享分配的所有权,只有当所有对象/函数都完成分配时,目标对象才会被删除。T*
是一个非所有者指针。 这由函数返回,以指示调用方不拥有该对象。 调用方不应删除对象; 实际上,调用方可能不会删除它。 一旦拥有对象/函数破坏目标对象,则调用方不应使用指针。返回原始指针本身并没有什么问题,不过我只会在函数需要有条件地访问它拥有的对象时返回指针:
T*
:该函数将向对象返回一个非所有者句柄,但它可能没有对象,因此可以返回Nullptr
。 T*
是“可选的,非所有者对象句柄。”t&
:函数返回一个对象的非所有者句柄,它将始终返回这样一个对象。 t&
是“强制的,非所有者对象句柄。”请注意,并非所有标准图书馆设施都将遵守这些准则; 的确不是所有人都能做到! 新T
必须返回一个T*
,因为这是定义它的工作方式。 这些是您在应用程序中应该遵循的指导原则。