我遇到了RobotControl类成员的问题。 UML指定RobotControl的位置和RangeSensor之间的关系作为组合。没有使用指针,让它们聚合?我该如何声明 - 根据UML创建这些成员,或者UML有错误?
答案 0 :(得分:1)
C ++中的指针可用于聚合和合成。正确noted by Douglas的区别在于对象的生命周期是否相互关联。换句话说:当父母被摧毁时,孩子是否被摧毁了?答案是代表组合,否代表聚合。
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