我对C ++设计/实现的最佳实践有疑问。我发现自己无法确定成员变量应该是指针还是指针。
假设我有一个这样的课程:
class Person{
public:
string name;
int age;
Child c;
};
让我们说我想要"孩子c"要有活力。让我们说,在创建一个" Person"之后,我不确定该人是否有孩子。可能是该人确实有一个孩子并且没有孩子。考虑到这一点,我希望能够在人员 一个孩子的情况下检查代码。
最好将其声明为" Child * c"或者"孩子c"?
鉴于此,
更好class Person{
public:
string name;
int age;
Child* c;
};
答案 0 :(得分:4)
如果你想要人要么生孩子,那么毫无疑问;您不能声明 Person 拥有 Child 类型的数据成员。通过让孩子成为数据成员, Person 将无条件地拥有一个成员。
您当然可以通过指向孩子的指针解决此问题,然后 Person 将能够引用 Child 如果存在,或者在指向孩子的指针中有nullptr
来表示不存在这样的孩子。
你需要决定人是否拥有一个孩子,或者只是能够引用一个孩子。
如果您认为 Person 是其子女的所有者,建议您通过所有权 > std::unique_ptr
,这也可以轻松处理所述孩子的生命。
如果您希望Person在其他实例(或其他一些代码)之间共享子项,请使用 std::shared_ptr
。
如果您只是希望Person能够引用一个孩子(根本没有所有权),并且能够改变一个人所指的孩子(如果有孩子的话);使用原始指针。
如果您希望 Person 能够引用已存在的子项,从其生命的开始到结束,请使用由人
你可以让Child
包含某些信息来告诉你它的内在状态,有" alive" 或"没有活着" 但这在表达方面并不明显,或表达"在人中有一个孩子" 使用类似的方法。
答案 1 :(得分:3)
指针在这里根本不合适,并且您不需要动态分配来获得"可选"构件。
如果 使用指针,您可以使用智能指针来管理指针对象的生命周期。
答案 2 :(得分:0)
如果添加非指针属性,则将该对象的生命周期绑定到包含对象的生命周期。
如果你不想要,那么你需要一个指针。
或者你可以使用某种容器(例如std :: vector)来存储属性...但这意味着语义为(0 .. *)而不是(0..1)
偏好/需要指针的其他原因:
什么样的指针取决于你。如果您想避免麻烦,请使用shared_ptr或unique_ptr。 如果你使用原始指针,那么你应该关心分配对象的所有权,即负责分配它的人和负责解除分配的最重要的。