Iあなたの本当の疑問は、構成と集計の関係であると考えています。あなたは所有権の面で違いを考えることができますが、私のお金のための実際の区別は、集約されたオブジェクトのライフサイクルを制御するものです。
組成中。合成されたオブジェクトが破棄されると、その中に含まれているパーツやクラスが破壊されます。集約では、含まれているオブジェクトの存続時間は、そのオブジェクトを含むオブジェクトとは独立しています。コード内。これは、コンポーネントオブジェクトが値または参照によって指定されているかどうかになります。集約はになります(この例ではポインタ)。値によって行われた場合、コンポーネントパーツは範囲外になり、オブジェクトを含むことで破壊され、したがって合成されます。
この場合、エンジンは構成の例であり、バッテリーは集計の例です。
#include <iostream>
using namespace std;
class Engine
{
public:
Engine() {cout << "Engine created\n";};
~Engine() {cout << "Engine destroyed\n";};
};
class Battery
{
public:
Battery() {cout << "Battery created\n\n";};
~Battery() {cout << "\nBattery destroyed\n";};
};
class Car
{
private:
Battery *bat;
Engine eng; //Engine will go out of scope with Car
public:
Car(Battery* b) : bat(b) {cout << "Car created\n";};
~Car() {cout << "Car destroyed\n";};
void drive(int miles) {/*...*/};
};
int main(int argc, char *argv[])
{
//a Battery lifecycle exists independently of a car
Battery* battery = new Battery();
//but a car needs to aggregate a Battery to run
Car* car1 = new Car(battery);
car1->drive(5);
//car1 and its Engine destroyed but not the Battery
delete car1;
cout << "---------------\n";
//new car, new composed Engine, same old Battery
Car* car2 = new Car(battery);
car2->drive(5);
delete car2;
//destroy battery independently of the cars
delete battery;
}
謝罪、これが最良の例ではないですが、うまくいけば、それは主なポイントを示している場合。