web-dev-qa-db-fra.com

C ++: Association, agrégation et composition

Je commence à étudier OOAD et j'ai du mal à trouver un C++ exemple de code qui illustrerait la manière dont Association, Aggregation et Composition sont implémentés par programme. (Il y a plusieurs articles partout mais ils concernent C # ou Java). J'ai trouvé un exemple ou deux, mais ils sont tous en conflit avec les instructions de mon instructeur et je suis confus.

Ma compréhension est que dans:

  • Association: Foo a un pointeur sur l'objet Bar en tant que membre de données
  • Agrégation: Foo a un pointeur sur l'objet Bar et les données de Bar sont copiées en profondeur dans ce pointeur.
  • Composition: Foo a un objet Bar comme membre de données.

Et voici comment je l'ai implémenté:

//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;
    }
};

Est-ce correct? Sinon, comment faut-il procéder à la place? Ce serait apprécié si vous me donniez également une référence d'un code d'un livre (afin que je puisse discuter avec mon instructeur)

5
Talha5389

Il existe plusieurs façons de mapper les concepts OO d'association , d'agrégation et composition en code C++. Cela est particulièrement vrai pour l'agrégation , car il n'y a même pas de consensus sur ce que cela signifie exactement.

Votre mappage suggère la sémantique suivante, qui n'est pas fausse:

  • Association: Foo a un pointeur sur l'objet Bar en tant que membre de données, sans gérer l'objet Bar -> Foo connaît Bar
  • Composition: Foo a un objet Bar en tant que membre de données -> Foo contient une barre. Il ne peut exister sans lui.
  • Agrégation: Foo a un pointeur sur l'objet Bar et gère la durée de vie de cet objet -> Foo contient une barre, mais peut également exister sans.

Comme indiqué, l'agrégation est la plus difficile ici car, même au sein d'UML, la signification de agrégation n'est pas limpide. Une autre signification possible de l'agrégation est "Foo contient un objet Bar qui est partagé avec d'autres objets". Cela serait généralement représenté dans le code C++ au moyen d'un std::shared_pointer ou boost::shared_pointer.
La signification que votre instructeur attache à l'agrégation doit être discutée avec lui.

6