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