Powiedzmy, że mam dwa typy obiektów, A i B. Relacje między nimi są wiele do wielu, ale żaden z nich nie jest właścicielem drugiego.
Zarówno wystąpienia A, jak i B muszą być świadome połączenia; to nie tylko jeden sposób.
Możemy to zrobić:
class A
{
...
private: std::vector<B *> Bs;
}
class B
{
private: std::vector<A *> As;
}
Moje pytanie brzmi: gdzie mam umieścić funkcje do tworzenia i niszczenia połączeń?
Czy powinien to być A :: Attach (B), który następnie aktualizuje A :: Bs i B :: As wektory?
A może powinien to być B :: Attach (A), co wydaje się równie rozsądne.
Żadne z tych nie wydaje się właściwe. Jeśli przestanę pracować z kodem i wrócę po tygodniu, jestem pewien, że nie będę w stanie przypomnieć sobie, czy powinienem wykonywać A.Attach (B) lub B.Attach (A).
Być może powinna to być taka funkcja:
CreateConnection(A, B);
Ale tworzenie funkcji globalnej również wydaje się niepożądane, biorąc pod uwagę, że jest to funkcja specjalnie do pracy tylko z klasami A i B.
Kolejne pytanie: jeśli często napotykam ten problem / wymaganie, czy mogę w jakiś sposób znaleźć ogólne rozwiązanie tego problemu? Być może klasa TwoWayConnection, z której mogę czerpać lub korzystać z klas dzielących ten rodzaj relacji?
Jakie są dobre sposoby poradzenia sobie z tą sytuacją ... Wiem, jak całkiem dobrze poradzić sobie z sytuacją „C jest właścicielem D” jeden do wielu, ale ta jest trudniejsza.
Edycja: aby wyjaśnić, to pytanie nie wiąże się z problemami własnościowymi. Zarówno A, jak i B są własnością jakiegoś innego obiektu Z, a Z zajmuje się wszystkimi kwestiami własności. Interesuje mnie tylko sposób tworzenia / usuwania połączeń wiele do wielu między A i B.
Pointer
i GestureRecognizer
. Wskaźniki są własnością klasy InputManager i są przez nią zarządzane. GestureRecognizers są własnością instancji Widget, które z kolei są własnością instancji Screen, która jest własnością instancji aplikacji. Wskaźniki są przypisywane do GestureRecognizers, aby mogli przekazywać im surowe dane wejściowe, ale GestureRecognizers muszą być świadomi, ile wskaźników jest obecnie z nimi powiązanych (aby odróżnić gesty 1 palcem od 2 palców itp.).