何时在C ++中使用成员指针变量

时间:2014-06-12 18:56:23

标签: c++

我对C ++设计/实现的最佳实践有疑问。我发现自己无法确定成员变量应该是指针还是指针。

假设我有一个这样的课程:

class Person{
     public:
        string name;
        int age;
        Child c;
};

让我们说我想要"孩子c"要有活力。让我们说,在创建一个" Person"之后,我不确定该人是否有孩子。可能是该人确实有一个孩子并且没有孩子。考虑到这一点,我希望能够在人员 一个孩子的情况下检查代码。

最好将其声明为" Child * c"或者"孩子c"?

鉴于此,

更好
class Person{
         public:
            string name;
            int age;
            Child* c;
    };

3 个答案:

答案 0 :(得分:4)

简介

如果你想要要么生孩子,那么毫无疑问;您不能声明 Person 拥有 Child 类型的数据成员。通过让孩子成为数据成员, Person 将无条件地拥有一个成员。

您当然可以通过指向孩子的指针解决此问题,然后 Person 将能够引用 Child 如果存在,或者在指向孩子的指针中有nullptr来表示不存在这样的孩子。


进一步的想法

你需要决定人是否拥有一个孩子,或者只是能够引用一个孩子。

  • 如果您认为 Person 是其子女的所有者,建议您通过所有权 > std::unique_ptr ,这也可以轻松处理所述孩子的生命。

  • 如果您希望Person在其他实例(或其他一些代码)之间共享子项,请使用 std::shared_ptr

  • 如果您只是希望Person能够引用一个孩子(根本没有所有权),并且能够改变一个人所指的孩子(如果有孩子的话);使用原始指针。

  • 如果您希望 Person 能够引用已存在的子项,从其生命的开始到结束,请使用由


如果我真的想要一个孩子作为每个人的数据成员怎么办?

你可以让Child包含某些信息来告诉你它的内在状态,有" alive" "没有活着" 但这在表达方面并不明显,或表达"在中有一个孩子" 使用类似的方法。

答案 1 :(得分:3)

指针在这里根本不合适,并且您不需要动态分配来获得"可选"构件。

最好使用a boost::optional<Child>

如果 使用指针,您可以使用智能指针来管理指针对象的生命周期。

答案 2 :(得分:0)

如果添加非指针属性,则将该对象的生命周期绑定到包含对象的生命周期。

如果你不想要,那么你需要一个指针。

或者你可以使用某种容器(例如std :: vector)来存储属性...但这意味着语义为(0 .. *)而不是(0..1)

偏好/需要指针的其他原因:

  1. 隐藏实现的细节(使用指向父抽象类的指针)或能够存储来自层次结构不同部分的对象。
  2. 避免使用循环引用。
  3. 什么样的指针取决于你。如果您想避免麻烦,请使用shared_ptrunique_ptr。 如果你使用原始指针,那么你应该关心分配对象的所有权,即负责分配它的人和负责解除分配的最重要的