我无法区分聚合和持有之间的区别。就C ++来说,这意味着什么呢?
我想当A类的对象持有(或实例化)B类对象时,它会使用它来自行执行某些功能。
例如:
class A {
int state;
public:
A(int s): state(s) {}
int inc() { return state++; }
};
class B {
int app;
string s;
public:
B(): app(0), s("") {}
B(int A, const string& str): app(A), s(str) {}
void f(int p);
~B() { app = 0; s = ""; }
};
void B::f(int p)
{
A mA(p);
app = mA.inc();
}
A类对象的聚合如下:
class B{
A t;
//...
}
请给我一个指向网站或书籍中某个地方的链接,在那里我可以找到关于OO语言的明确定义,确切地说每个类之间的关系是什么。
答案 0 :(得分:1)
持有另一个类意味着一个类通过父子关系与另一个类相关联。例如,Path有一个点列表。 Path是Points List的父级,它是各个点的父级。
聚合意味着使用不同的类并将它们放在接口后面,以便它们显示为一个类。例如,FileDialog将具有多个按钮类,文本输入类,listview / treeview类等。但是对于系统的其余部分,它只需要激活方法,可以分配默认文件名,然后检索其余文件。
它由所有其他类组成的事实对于使用它作为filedialog的其他类来说并不重要。但是它通过聚合所有类来执行预期的行为。
答案 1 :(得分:1)
IMO,如果我理解正确的话,你要求定义组合与聚合。聚合或保留是实体的集合。构图具有更严格的约束。考虑给予学生的平均分数:当我们计算平均分时,我们不能排除任何项目。组成与此类似。没有项目可以错过。另一方面,聚合的定义更为松散。
一个有趣的比喻是箭袋和汽车的箭袋。箭袋是箭的聚合体,箭可以不带箭头存在;汽车是一种组合(零件总和)。不要说没有车轮的汽车仍然是汽车:)
至于参考文献:http://www.bletchleypark.net/algorithms/software/oop.html
答案 2 :(得分:0)
这非常关乎所有权和知名度。这些关系有不同的名称,但您应该考虑以下两点:
父母是否对孩子有严格的所有权,这样当父母去世时,孩子也应该死?
除了父母之外,其他实体是否可以看到孩子?
这些问题的答案将帮助您澄清这些关系。