所有权和原始指针?
智能指针通常带有所有权语义,因此当您不想提供/共享所有权时使用它们中的任何一个都是一个坏主意。
在我自己的代码中,我决定了以下约定:
原始指针意味着没有所有权转移/共享
这意味着如果某些函数接收原始指针作为参数,则它没有所有权(因此,不应尝试删除它)。同样,返回原始指针的函数不会转移/共享所有权(因此,调用者也不应该尝试删除它)。
因此,在您的情况下,您可以返回指针而不是智能指针。
指针还是参考?
这意味着指针和引用之间的选择仅取决于由以下规则解决的一个因素:
- 如果
nullptr
/NULL
值有意义,则使用指针。
- 如果
nullptr
/NULL
值没有意义和/或不受欢迎,则使用引用。
常量和成员变量?
我看到了一些关于 constness 的答案,所以我添加了我自己的两分钱:
将非常量值返回给内部变量是一种设计选择。您必须做的是在以下吸气剂之间进行选择:
const Transform * getTransform() const ;
Transform * getTransform() ;
我将(滥用)上面的访问器称为“属性”,非 const 版本使用户能够在闲暇时修改内部 Transform 对象,而无需先询问您的班级。您会注意到,如果 GameObject 是 const,则无法修改其内部 Transform 对象(唯一可访问的 getter 是 const 的,返回 const)。您还会注意到,您无法更改 GameObject 中的 Transform 对象的地址。您只能通过该地址更改数据指针(这与使成员变量公开不同)
const Transform *& getTransform() const ;
Transform *& getTransform() ;
这与上面的情况类似,但是由于引用,用户可以直接访问指针地址,这意味着非常量访问器或多或少类似于将成员变量公开。
const Transform * getTransform() const ;
void setTransform(Transform * p_transform) ;
我将上面的访问器(粗暴地)称为“getter/setter”:如果用户想要修改转换值,那么他必须使用 setTransform。你对你正在做的事情有更多的控制(注意在我的代码中,你传递一个 unique_ptr 或一个 auto_ptr 来表达对 p_transform 对象的总所有权的获取。你会注意到,如果 GameObject 是 const ,无法修改其内部 Transform 对象(setter 是非常量)。
Transform * getTransform() const ;
我(粗暴地)将访问器称为“下标”,因为在指针数组中,数组可以是 const,因此内部地址是 const,但是该地址指向的数据是非常量的,因此可以对其进行修改. 这通常意味着 Transform 对象并不真正由您的 GameObject 对象“拥有”。事实上,为了便于使用,GameObject 很可能只引用了一些外部对象。