用指针组成

时间:2017-12-21 04:02:04

标签: c++ oop pointers composition

UML diagram of classes

我遇到了RobotControl类成员的问题。 UML指定RobotControl的位置和RangeSensor之间的关系作为组合。没有使用指针,让它们聚合?我该如何声明 - 根据UML创建这些成员,或者UML有错误?

1 个答案:

答案 0 :(得分:1)

C ++中的指针可用于聚合和合成。正确noted by Douglas的区别在于对象的生命周期是否相互关联。换句话说:当父母被摧毁时,孩子是否被摧毁了?答案代表组合,代表聚合。

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

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

使用指针聚合

在这种情况下,只需在class Child声明之前正向声明class Parent,并且child成员可以在{{的生命周期内设置和重新设置。 1}}。

Parent

带指针的构图

最长的例子表明我们可以使用指针动态创建和销毁class Child; class Parent { public: Parent(Child* ch) : child(ch) {} Parent() : child(NULL) {} void setChild(Child* ch) { child = ch; } private: Child* child; }; child的生命周期与child紧密相关。但是,由于指针,我们仍然可以在Parent的生命周期内交换child ren。此解决方案还允许仅在头文件中转发Parent,与下面的替代方案不同。

class Child

声明

此示例是Rule of three/five/zero的主题。我故意让缺少推荐方法的实现取决于用户,使这个答案与方言无关,并且尽可能简单。

没有指针的组合

不是手动编写构造函数和析构函数,而是可以在类声明中声明// --- 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; } ,让编译器为您进行构造和销毁。只要child的构造函数不需要参数(否则你需要手动编写class Child的构造函数)并且class Parent在声明之前完全声明,这是有效的。 class Child

class Parent

没有指针的聚合

要完成,使用指针进行聚合的替代方法是使用引用。但是,这可以防止在#include "child.h" class Parent { private: Child child; }; 对象的生命周期内交换child ren。

Parent