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.