Supponiamo che io abbia
- tre classi
P
,C1
,C2
, - composizione (strong aggregazione) relazioni tra
P <>- C1
eP <>- C2
, cioè ogni istanza diP
contiene un'istanza diC1
e un'istanza diC2
, che vengono distrutti quando l'istanza genitoreP
è distrutto. - una relazione di associazione tra istanze di
C1
eC2
(non necessariamente tra figli dello stessoP
).
Per implementarlo, in C ++ normalmente
- definisce tre classi
P
,C1
,C2
, - definisce due variabili membro di
P
di tipoboost::shared_ptr<C1>
,boost::shared_ptr<C2>
e le inizializza con oggetti appena creati nel costruttore diP
, - implementa la relazione tra
C1
eC2
utilizzando una variabile membroboost::weak_ptr<C2>
inC1
e una variabile membroboost::weak_ptr<C1>
inC2
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.