所有权和裸指针?
智能指针通常具有所有权语义,因此在不想给予/共享所有权时使用它们是一个坏主意。
在我自己的代码中,我决定以下约定:
裸指针表示没有所有权转移/共享
这意味着如果某些函数接收裸指针作为参数,则它没有所有权(因此,不应尝试删除它)。同样,返回裸指针的函数不会传递/共享所有权(因此,调用者不应尝试删除它)。
因此,在您的情况下,您可以返回指针而不是智能指针。
指针还是引用?
这意味着指针和引用之间的选择仅取决于以下规则解决的一个因素:
- 如果
nullptr
/NULL
值有意义,则使用指针。
- 如果
nullptr
/NULL
值没有意义和/或不希望,则使用引用。
常量性和成员变量?
我看到了一些关于常量性的答案,所以我加上了我的两分钱:
将非const值返回给内部变量是一种设计选择。你必须在以下getter之间进行选择:
const Transform * getTransform() const ;
Transform * getTransform() ;
我(不当地)称上述访问器为“属性”,非const版本使用户可以随意修改内部Transform对象,而无需先询问您的类。请注意,如果GameObject是const,则无法修改其内部Transform对象(唯一可访问的getter是const版本)。此外,请注意,您不能更改GameObject内部Transform对象的地址,只能通过该地址更改数据指针(这与将成员变量公开不同)。
const Transform *& getTransform() const ;
Transform *& getTransform() ;
这就像上面的情况,但由于引用的存在,用户直接访问指针地址,这意味着非const访问器更或多或少地类似于将成员变量公开。
const Transform * getTransform() const ;
void setTransform(Transform * p_transform) ;
我将上面的访问器滥用地称为“getter/setter”:如果用户想修改变换值,则必须使用setTransform。这样你就可以更好地控制你正在做的事情(请注意,在我的代码中,你可以通过传递unique_ptr或auto_ptr来表达对p_transform对象的全部所有权的获取。你会注意到,如果GameObject是const,就没有办法修改其内部的Transform对象(setter是非const的)。
Transform * getTransform() const ;
我有时会滥用称呼上述访问器为“下标”,比如在指针数组中,该数组可以是const类型,所以内部地址是const的,但是由该地址指向的数据是non-const的,因此它可以被修改。这通常意味着Transform对象并不真正被你的GameObject对象“拥有”。实际上,很可能是GameObject仅引用某个外部对象,以方便使用。