Katakanlah saya memiliki dua jenis objek, A dan B. Hubungan di antara mereka banyak-ke-banyak, tetapi tidak satu pun dari mereka adalah pemilik yang lain.
Kedua instance A dan B harus mewaspadai koneksi; itu bukan hanya satu arah.
Jadi, kita bisa melakukan ini:
class A
{
...
private: std::vector<B *> Bs;
}
class B
{
private: std::vector<A *> As;
}
Pertanyaan saya adalah: di mana saya meletakkan fungsi untuk membuat dan menghancurkan koneksi?
Haruskah itu A :: Attach (B), yang kemudian memperbarui A :: Bs dan B :: As vektor?
Atau harus B :: Lampirkan (A), yang tampaknya sama-sama masuk akal.
Tak satu pun dari mereka terasa benar. Jika saya berhenti bekerja dengan kode, dan kembali setelah seminggu, saya yakin saya tidak akan dapat mengingat jika saya harus melakukan A.Attach (B) atau B.Attach (A).
Mungkin itu harus fungsi seperti ini:
CreateConnection(A, B);
Tetapi membuat fungsi global juga tampaknya tidak diinginkan, mengingat itu adalah fungsi khusus untuk bekerja dengan hanya kelas A dan B.
Pertanyaan lain: jika saya sering mengalami masalah / persyaratan ini, bisakah saya membuat solusi umum untuk itu? Mungkin kelas TwoWayConnection yang bisa saya peroleh atau gunakan dalam kelas yang berbagi jenis hubungan ini?
Apa sajakah cara yang baik untuk menangani situasi ini ... Saya tahu cara menangani situasi satu-ke-banyak "C memiliki D" dengan cukup baik, tetapi yang satu ini lebih rumit.
Sunting: Hanya untuk membuatnya lebih eksplisit, pertanyaan ini tidak melibatkan masalah kepemilikan. Baik A dan B dimiliki oleh beberapa objek Z lainnya, dan Z menangani semua masalah kepemilikan. Saya hanya tertarik dengan cara membuat / menghapus tautan banyak-ke-banyak antara A dan B.
Pointer
dan GestureRecognizer
. Pointer dimiliki dan dikelola oleh kelas InputManager. GestureRecognizers dimiliki oleh instance Widget, yang pada gilirannya dimiliki oleh instance layar yang dimiliki oleh instance App. Pointer ditugaskan ke GestureRecognizers sehingga mereka dapat mengumpankan data input mentah kepada mereka, tetapi GestureRecognizers perlu mengetahui berapa banyak pointer yang ada saat ini yang dikaitkan dengan mereka (untuk membedakan 1 jari vs 2 gerakan jari, dll.).