Diciamo che ho due tipi di oggetti, A e B. Il rapporto tra loro è molti-a-molti, ma nessuno dei due è il proprietario dell'altro.
Entrambe le istanze A e B devono essere consapevoli 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 quindi aggiorna A :: Bs e B :: Come vettori?
O dovrebbe essere B :: Attach (A), che sembra ugualmente ragionevole.
Nessuno di questi si sente bene. Se smetto di lavorare con il codice e torno dopo una settimana, sono sicuro che non sarò in grado di ricordare se dovrei fare A.Attach (B) o B.Attach (A).
Forse dovrebbe essere una funzione come questa:
CreateConnection(A, B);
Ma creare una funzione globale sembra anche indesiderabile, 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 crearne una soluzione generale? Forse una classe TwoWayConnection da cui posso derivare o utilizzare all'interno di classi che condividono questo tipo di relazione?
Quali sono alcuni buoni modi per gestire questa situazione ... So come gestire abbastanza bene la situazione "C possiede D", ma questa è più complicata.
Modifica: solo per renderlo più esplicito, questa domanda non comporta problemi di proprietà. Sia A che B appartengono a qualche altro oggetto Z e Z si occupa di tutti i problemi di proprietà. Sono interessato solo a come creare / rimuovere i collegamenti molti-a-molti tra A e B.
Pointer
e GestureRecognizer
. I puntatori sono di proprietà e gestiti dalla classe InputManager. GestureRecognizer è di proprietà di istanze Widget, che a loro volta sono di proprietà di un'istanza Screen che è di proprietà di un'istanza App. I puntatori vengono assegnati ai GestureRecognizer in modo che possano fornire loro dati di input non elaborati, ma i GestureRecognizer devono essere consapevoli del numero di puntatori attualmente associati (per distinguere i gesti da 1 dito a 2 dita, ecc.).