1) Come sempre dipende dal contesto. La prima opzione ha il vantaggio di non avere accoppiamento tra le varie classi, il che da un design più pulito, cosa che invece non avviene con le altre due opzioni. Tradotto in soldoni, la prima opzione rende indipendenti le classi, le altre due no; il vantaggio è nel riutilizzo del codice: nella prima opzione hai le classi come entità singole per cui puoi riusarne una senza che le altre due sappiano che esiste, cosa che non è detto avvenga nelle altre opzioni.
2) Fa un esempio concreto di cosa intendi.
3) Lascia perdere weak_ptr che si usa solo in casi particolari: dentro una classe si usano solo shared_ptr o unique_ptr, la cui scelta si decide in base al contesto in cui si opera.

Rispondi quotando
, per cui mi risulta difficile capire quali possano essere i contesti...Intanto, optiamo per la soluzione più pulita e più riciclabile, quando poi capirò i diversi contesti, vedremo di adattarci, per ora, avanti in questo modo.