Come implementare il link di aggregazione figlio-genitore in C ++?

6

Supponiamo che io abbia

  • tre classi P , C1 , C2 ,
  • composizione (strong aggregazione) relazioni tra P <>- C1 e P <>- C2 , cioè ogni istanza di P contiene un'istanza di C1 e un'istanza di C2 , che vengono distrutti quando l'istanza genitore P è distrutto.
  • una relazione di associazione tra istanze di C1 e C2 (non necessariamente tra figli dello stesso P ).

Per implementarlo, in C ++ normalmente

  • definisce tre classi P , C1 , C2 ,
  • definisce due variabili membro di P di tipo boost::shared_ptr<C1> , boost::shared_ptr<C2> e le inizializza con oggetti appena creati nel costruttore di P ,
  • implementa la relazione tra C1 e C2 utilizzando una variabile membro boost::weak_ptr<C2> in C1 e una variabile membro boost::weak_ptr<C1> in C2 che può essere impostata in un secondo momento tramite metodi appropriati, quando la relazione viene stabilita .

Ora vorrei anche avere un link da ogni C1 e C2 oggetto al suo oggetto genitore P . Qual è un buon modo per implementarlo?

La mia idea attuale è quella di utilizzare un semplice puntatore raw constant ( P * const ) impostato dal costruttore di P (che, a sua volta, chiama i costruttori di C1 e C2 ), ad es. qualcosa come:

class C1
{
  public:
    C1(P * const p, ...)
    : paren(p)
    {
    ...
    }

  private:
    P * const parent;
    ...
};

class P
{
  public:
    P(...)
    : childC1(new C1(this, ...))
    ...
    {
        ...
    }

  private:
    boost::shared_ptr<C1> childC1;
    ...
};

Onestamente non vedo alcun rischio nell'usare un puntatore raw costante in questo modo, ma so che i puntatori grezzi sono spesso disapprovati in C ++, quindi mi chiedevo se esiste una soluzione alternativa.

    
posta Giorgio 03.10.2012 - 16:40
fonte

1 risposta

1

I puntatori creano mal di testa quando li si usa per gestire risorse allocate dinamicamente. In questo caso, tuttavia, un puntatore è un semplice "backlink" al genitore, e non può essere modificato durante la vita di un oggetto figlio (cioè non c'è un re-parenting). Questa è una buona soluzione che ti aiuta a mantenere le cose semplici.

    
risposta data 03.10.2012 - 16:50
fonte

Leggi altre domande sui tag