Oop 持有类的对象和聚合它们之间有什么区别?

Oop 持有类的对象和聚合它们之间有什么区别?,oop,class,relationship,Oop,Class,Relationship,我无法区分聚合和持有之间的区别。这意味着什么,比如说,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 st

我无法区分聚合和持有之间的区别。这意味着什么,比如说,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语言中找到明确的定义类之间的每种关系到底是什么。

这与所有权和可见性有关。这些关系有不同的名称,但是你应该考虑这两点:

  • 父母是否对孩子有严格的所有权,以至于当父母去世时,孩子也应该死去

  • 子实体对父实体以外的其他实体可见吗


回答这些问题有助于澄清这些关系。

持有另一个类意味着一个类通过父子关系与另一个类相关联。例如,路径具有点列表。路径是点列表的父级,该列表是各个点的父级

聚合意味着获取不同的类并将它们放在接口后面,以便它们显示为一个类。例如,一个FileDialog将有几个按钮类、一个文本输入类、一个listview/treeview类等等。但是对于系统的其余部分,它只是有一些方法需要激活,可能会分配一个默认文件名,然后检索其余的


它由所有其他类组成的事实对于将其用作文件对话框的其他类来说并不重要。但是,它通过聚合所有类来执行预期的行为来工作。

IMO,如果我理解正确,您要求的是合成与聚合的定义。聚合或持有是实体的集合。构图有更严格的限制。想想给学生的平均分数:当我们计算平均分时,我们不能排除任何项目。构图与此相似。任何项目都不能遗漏。另一方面,聚合的定义更为松散

一个有趣的类比是一个装满箭的箭袋和一辆汽车。箭袋是箭的集合体,箭袋可以没有箭而存在;汽车是一个组成部分(部件的总和)。让我们不要争辩说没有轮子的汽车仍然是汽车:)

关于参考资料: