Diyelim ki A ve B olmak üzere iki nesne tipim var. Aralarındaki ilişki çoktan çoğa, ama ikisi de diğerinin sahibi değil.
A ve B örneklerinin her ikisi de bağlantının farkında olmalıdır; bu sadece bir yol değil.
Yani, bunu yapabiliriz:
class A
{
...
private: std::vector<B *> Bs;
}
class B
{
private: std::vector<A *> As;
}
Sorum şu: bağlantıları oluşturmak ve yok etmek için fonksiyonları nereye koyabilirim?
A :: Bs ve B :: vektör olarak güncellenen A :: Ek (B) olmalı mı?
Ya da eşit derecede makul görünen B :: Attach (A) olmalı.
Bunların hiçbiri doğru hissetmiyor. Kodla çalışmayı bırakırsam ve bir hafta sonra geri gelirsem, A.Attach (B) veya B.Attach (A) yapmam gerektiğini hatırlayamayacağımdan eminim.
Belki de böyle bir işlev olmalıdır:
CreateConnection(A, B);
Ancak, sadece A ve B sınıflarıyla çalışmak için bir işlev olduğu için, küresel bir işlev yapmak da istenmeyen bir durumdur.
Başka bir soru: sık sık bu sorun / gereksinim ile karşılaşırsam, bir şekilde genel bir çözüm yapabilir miyim? Belki de türetebileceğim veya bu tür bir ilişkiyi paylaşan sınıflar içinde kullanabileceğim bir TwoWayConnection sınıfı?
Bu durumla başa çıkmanın bazı iyi yolları nelerdir ... Bire-çok "C'nin D sahibi" durumunun oldukça iyi nasıl idare edileceğini biliyorum, ama bu daha zor.
Edit: Sadece daha açık yapmak için, bu soru sahiplik sorunları içermez. Hem A hem de B başka bir Z nesnesine aittir ve Z tüm sahiplik sorunlarını ele alır. Sadece A ve B arasındaki çoktan çoğa bağlantıları nasıl oluşturacağım / kaldıracağım.
Pointer
ve GestureRecognizer
. İşaretçiler, InputManager sınıfına aittir ve bu yönetim tarafından yönetilir. GestureRecognizers, bir App örneğine ait olan bir Screen örneğine ait olan Widget örneklerine aittir. İşaretçiler, GestureRecognizers'a ham giriş verilerini besleyebilmeleri için atanır, ancak GestureRecognizers'ın şu anda kendileriyle kaç tane işaretçi ilişkili olduğunun farkında olması gerekir (1 parmakla 2 parmak hareketini vb. Ayırt etmek).