Digamos que eu tenha dois tipos de objetos, A e B. O relacionamento entre eles é muitos-para-muitos, mas nenhum deles é o proprietário do outro.
As instâncias A e B precisam estar cientes da conexão; não é apenas uma maneira.
Então, podemos fazer isso:
class A
{
...
private: std::vector<B *> Bs;
}
class B
{
private: std::vector<A *> As;
}
Minha pergunta é: onde coloco as funções para criar e destruir as conexões?
Deveria ser A :: Attach (B), que atualiza os vetores A :: Bs e B :: As?
Ou deveria ser B :: Attach (A), que parece igualmente razoável.
Nenhum desses parece certo. Se eu parar de trabalhar com o código e voltar depois de uma semana, tenho certeza de que não poderei me lembrar se devo fazer A.Attach (B) ou B.Attach (A).
Talvez deva ser uma função como esta:
CreateConnection(A, B);
Mas tornar uma função global também parece indesejável, já que é uma função específica para trabalhar apenas com as classes A e B.
Outra pergunta: se eu me deparar com esse problema / requisito com frequência, posso de alguma forma fazer uma solução geral para ele? Talvez uma classe TwoWayConnection da qual eu possa derivar ou usar dentro de classes que compartilhem esse tipo de relacionamento?
Quais são algumas boas maneiras de lidar com essa situação ... Eu sei como lidar com a situação um-para-muitos "C possui D" muito bem, mas essa é mais complicada.
Editar: Apenas para tornar mais explícito, esta pergunta não envolve problemas de propriedade. Ambos A e B pertencem a outro objeto Z, e Z cuida de todos os problemas de propriedade. Estou interessado apenas em como criar / remover os links muitos para muitos entre A e B.
Pointer
e GestureRecognizer
. Os ponteiros são de propriedade e gerenciados pela classe InputManager. Os GestureRecognizers pertencem a instâncias de Widget, que por sua vez pertencem a uma instância de Tela pertencente a uma instância de App. Os ponteiros são atribuídos aos GestureRecognizers para que eles possam fornecer dados brutos de entrada, mas os GestureRecognizers precisam estar cientes de quantos ponteiros estão atualmente associados a eles (para distinguir gestos de um dedo versus dois dedos, etc.).