代码之家  ›  专栏  ›  技术社区  ›  aliemir

带指针的合成

  •  6
  • aliemir  · 技术社区  · 6 年前

    UML diagram of classes

    我和机器人控制班的成员有问题。UML将机器人控制位置和范围传感器之间的关系指定为组合。难道不为它们使用指针,使它们聚合吗?我应该如何声明-创建关于UML的这些成员,还是UML弄错了?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Melebius    6 年前

    C++中的指针可用于聚合和合成。区别在于 noted by Douglas ,对象的生存期是否互连。换句话说:当父母被毁灭时,孩子是否也被毁灭了?答案是 代表合成, 用于聚合。

    我们如何在C++代码中区分这些情况?

    C++中的指针可以表示另一个(动态创建的)对象的所有权,也可以只引用其他人拥有的对象。让我们在示例中显示差异。我将解释为什么指针对每种类型的关系都有用。

    带指针的聚合

    在这种情况下,只需向前声明 class Child 之前 class Parent 声明和 child 可以在的生存期内设置和重新设置成员 Parent .

    class Child;
    
    class Parent
    {
    public:
        Parent(Child* ch) : child(ch) {}
        Parent() : child(NULL) {}
        void setChild(Child* ch) { child = ch; }
    private:
        Child* child;
    };
    

    带指针的合成

    最长的示例表明,我们可以动态创建和销毁 小孩 使用指针。这个 小孩 的寿命与 父母亲 . 但是,我们仍然可以交换 小孩 任正非在 父母亲 多亏了指针。此解决方案还只允许转发声明 班级孩子 与下面的备选方案不同,在头文件中。

    // --- header file
    class Child;
    
    class Parent
    {
    public:
        Parent();
        ~Parent();
        void renewChild();
    private:
        Child* child;
    };
    
    // --- source file
    #include "child.h"
    
    Parent::Parent()
        : child(new Child)
    {
    }
    
    Parent::~Parent()
    {
        delete child;
    }
    
    void Parent::renewChild()
    {
        delete child;
        child = new Child;
    }
    

    免责声明

    此示例是 Rule of three/five/zero . 我有意让用户来实现缺少的推荐方法,使这个答案方言不可知,并且尽可能简单。

    无指针合成

    无需手动编写构造函数和析构函数,只需声明 小孩 在类声明中,让编译器为您进行构造和销毁。只要 班级孩子 的构造函数不需要参数(否则需要编写 类父级 s构造函数)和 班级孩子 类父级 .

    #include "child.h"
    
    class Parent
    {
    private:
        Child child;
    };
    

    无指针聚合

    完整地说,使用指针进行聚合的替代方法是使用引用。但是,这会阻止交换 小孩 任正非在 父母亲 对象

    class Child;
    
    class Parent
    {
    public:
        Parent(Child& ch) : child(ch) {}
    private:
        Child& child;
    };