Non c'è nulla che sia fondamentalmente viziato su questa idea. Quello che hai sono due relazioni. Boss possiede uno o più Worker s. E Worker ha un riferimento non proprietario a Boss . L'uso di un puntatore non elaborato suggerisce che Worker non proprio il puntatore memorizzato; lo sta semplicemente usando. Ciò significa che non controlla la durata dell'oggetto.
Non c'è nulla di sbagliato in tale rapporto di per sé. Tutto dipende da come viene utilizzato.
Ad esempio, se il riferimento a Boss che Worker memorizza è l'effettiva istanza di oggetto Boss che possiede Worker , allora tutto va bene. Perché? Perché presumibilmente, un'istanza Worker non può esistere senza un Boss che lo possiede. E poiché Boss lo possiede, questo garantisce che Worker non sopravviverà al Boss a cui fa riferimento.
Beh ... un po '. Ed è qui che inizi a entrare in potenziali problemi.
In primo luogo, secondo le regole della costruzione C ++, Boss::worker viene costruita prima dell'istanza Boss stessa. Ora, il costruttore di Boss può passare un puntatore this al costruttore di Worker . Ma Worker non può utilizzarlo , poiché l'oggetto Boss non è ancora stato creato. Worker può memorizzarlo, ma non può accedere a nulla in esso.
Allo stesso modo, con le regole della distruzione di C ++, Boss::worker sarà distrutto dopo l'istanza di possesso di Boss . Pertanto, il distruttore di Worker non può utilizzare in modo sicuro il puntatore Boss , poiché punta a un oggetto la cui durata è terminata.
Queste limitazioni possono talvolta portare alla necessità di utilizzare la costruzione a due stadi. Cioè, chiamando Worker indietro dopo che Boss è stato completamente costruito, in modo che possa comunicare con esso durante la costruzione. Ma anche questo può essere OK, in particolare se Worker non ha bisogno di parlare con Boss nel suo costruttore.
Anche la copia diventa un problema. O più al punto, gli operatori di assegnazione diventano problematici. Se Worker::boss è destinato a puntare all'istanza Boss specifica che lo possiede, allora non devi mai copiarlo. Infatti, se questo è il caso, dovresti dichiarare Worker::boss come puntatore costante, in modo che il puntatore venga impostato nel costruttore e da nessun'altra parte.
Il punto di questo esempio è che l'idea che hai definito non è, da sola, irragionevole. Ha un significato ben definito e puoi usarlo per molte cose. Devi solo pensare su cosa stai facendo.