Diciamo che ho due tipi di oggetto, A e B. La relazione tra loro è molti-a-molti, ma nessuno dei due è il proprietario dell'altro.
Entrambe le istanze A e B devono essere a conoscenza della connessione; non è solo un modo.
Quindi, possiamo fare questo:
class A
{
...
private: std::vector<B *> Bs;
}
class B
{
private: std::vector<A *> As;
}
La mia domanda è: dove inserisco le funzioni per creare e distruggere le connessioni?
Dovrebbe essere A :: Attach (B), che aggiorna i vettori A :: Bs e B :: As?
O dovrebbe essere B :: Attach (A), che sembra altrettanto ragionevole.
Nessuno di questi sembra giusto. Se smetto di lavorare con il codice e torno dopo una settimana, sono sicuro che non potrò ricordare se dovrei fare A.Attach (B) o B.Attach (A).
Forse dovrebbe essere una funzione come questa:
CreateConnection(A, B);
Ma anche rendere una funzione globale non è auspicabile, dato che è una funzione specifica per lavorare solo con le classi A e B.
Un'altra domanda: se incontro spesso questo problema / requisito, posso in qualche modo creare una soluzione generale per questo? Forse una classe TwoWayConnection che posso derivare da o utilizzare all'interno di classi che condividono questo tipo di relazione?
Quali sono alcuni buoni modi per gestire questa situazione ... So come gestire la situazione one-to-many "C owns D" abbastanza bene, ma questa è più complicata.
Modifica: solo per renderlo più esplicito, questa domanda non riguarda i problemi di proprietà. Sia A che B sono di proprietà di qualche altro oggetto Z, e Z si prende cura di tutti i problemi di proprietà. Sono solo interessato a come creare / rimuovere i collegamenti molti-a-molti tra A e B.