Ho 3 classi: Riunione , Progetto e Agenda .
- Un progetto contiene tutti i tipi di informazioni + un elenco di riunioni.
- L' Agenda contiene un elenco di riunioni imminenti.
- Un Riunione contiene alcuni dati + un elenco di progetti che sono stati discussi qui.
L'agenda verifica le prossime riunioni. Quando ne trova uno, chiama il suo metodo Meeting :: alarm () , che a sua volta visualizza i dati che ottiene dall'elenco dei progetti a cui questo meeting fa riferimento.
Le riunioni possono essere referenziate in un progetto senza essere programmate nell'agenda , ma non ha senso avere un riferimento a una riunione nell'agenda se non è contenuto in un progetto.
Poiché l' agenda può essere analizzata in un thread mentre il thread principale elimina un progetto , ho fatto in modo che sia Agenda sia Project usino i puntatori condivisi nelle riunioni, in modo che l'analisi thread non trova un puntatore pendente.
Nel distruttore del Progetto , chiedo a Agenda di controllare le riunioni relative a questo progetto per ripulire quelli che non hanno altri progetti correlati.
Ecco il mio problema:
Che tipo di struttura dati dovrebbe essere il membro Meeting :: parentProjects?
Se un meeting viene chiamato dall'agenda mentre il suo progetto viene eliminato e genitoreProjects è un semplice contenitore di puntatori grezzi, potrei avere un penzoloni qui. Ma non posso neanche usare un shared_ptr per Project, dato che farebbe una dipendenza ciclica ... Mi sembra che sia inutilmente complicato.
Come potrei refactoring? Nota: I devono mantenere i 2 thread.