web-dev-qa-db-ja.com

C ++:関連付け、集約、構成

私はOOADの研究を始めており、AssociationAggregationおよびCompositionがプログラムによって実装される方法を示すC++コード例を見つけるのが困難です。 (至る所にいくつかの投稿がありますが、それらはC#またはJavaに関連しています)。私は例を1つまたは2つ見つけましたが、それらはすべて私のインストラクターの指示と矛盾し、混乱しています。

私の理解は、

  • Association: Fooには、データメンバーとしてBarオブジェクトへのポインターがあります
  • Aggregation: FooにはBarオブジェクトへのポインタがあり、Barのデータはそのポインタに深くコピーされます。
  • Composition: FooにはデータメンバーとしてBarオブジェクトがあります。

そして、これは私がそれを実装した方法です:

//ASSOCIATION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar* bar;
    void setBar(Bar* _bar)
    {
        bar=_bar;
    }
};

//AGGREGATION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar* bar;
    void setBar(Bar* _bar)
    {
        bar = new Bar;
        bar->baz=_bar->baz;
    }
};


//COMPOSTION
class Bar
{
    Baz baz;
};
class Foo
{
    Bar bar;
    Foo(Baz baz)
    {
        bar.baz=baz;
    }
};

これは正しいです?そうでない場合は、代わりにどのように行う必要がありますか?本のコードのリファレンスも教えていただければ幸いです(インストラクターと話し合うため)。

5
Talha5389

OOassociationaggregationおよびcompositionをC++コードに変換します。これは特にaggregation、それが正確に何を意味するのかコンセンサスすら存在しないため。

マッピングは次のセマンティクスを示唆していますが、これは誤りではありません。

  • Association:Fooは、Barオブジェクトを管理せずに、データメンバーとしてBarオブジェクトへのポインターを持っています->FooはBarを知っています
  • 構成:FooにはデータメンバーとしてBarオブジェクトがあります->Fooにはバーが含まれています。それなしでは存在できません。
  • Aggregation:FooにはBarオブジェクトへのポインタがあり、そのオブジェクトの存続期間を管理します->Fooにはバーが含まれますが、バーがなくても存在できます。

すでに述べたように、UML内でもaggregationの意味が明確ではないため、ここでは集約は困難です。集計のもう1つの可能な意味は、「Fooには他のオブジェクトと共有されるBarオブジェクトが含まれている」ことです。これは通常、C++コードではstd::shared_pointerまたはboost::shared_pointerによって表されます。
インストラクターがaggregationにアタッチするという意味は、彼と話し合う必要があります。