AとBの2つのオブジェクトタイプがあるとします。これらのオブジェクト間の関係は多対多ですが、どちらも他方の所有者ではありません。
AインスタンスとBインスタンスの両方が接続を認識する必要があります。片道だけではありません。
だから、これを行うことができます:
class A
{
...
private: std::vector<B *> Bs;
}
class B
{
private: std::vector<A *> As;
}
私の質問は次のとおりです。接続を作成および破棄する関数をどこに配置すればよいですか。
A :: Attach(B)である必要があります。これにより、A :: BsおよびB :: Asベクトルが更新されますか?
または、B :: Attach(A)である必要があります。
それらのどちらも正しくないと感じています。コードの操作をやめて、1週間後に戻ってきた場合、A.Attach(B)とB.Attach(A)のどちらを実行するべきかを思い出すことができないと確信しています。
おそらくそれはこのような関数であるべきです:
CreateConnection(A, B);
ただし、グローバル関数を作成することは、クラスAとBのみを操作するための関数であることから、望ましくないように見えます。
別の質問:この問題/要件に頻繁に遭遇した場合、どうにかして一般的な解決策を作成できますか?おそらく、このタイプの関係を共有するクラスから派生したり、クラス内で使用できるTwoWayConnectionクラスですか?
この状況に対処するための良い方法は何ですか... 1対多の「CがDを所有する」状況をうまく処理する方法を私は知っていますが、これはトリッキーです。
編集:より明確にするために、この質問には所有権の問題は含まれていません。AとBの両方が他のオブジェクトZによって所有されており、Zはすべての所有権の問題を処理します。AとBの間の多対多のリンクを作成/削除する方法にのみ興味があります。
Pointer
とGestureRecognizer
です。ポインタは、InputManagerクラスによって所有および管理されます。GestureRecognizersはWidgetインスタンスによって所有され、次にWidgetインスタンスがAppインスタンスによって所有されるScreenインスタンスによって所有されます。ポインターはGestureRecognizerに割り当てられ、生の入力データをそれらにフィードできるようになりますが、GestureRecognizerは現在関連付けられているポインターの数を認識する必要があります(1本の指と2本の指のジェスチャーなどを区別するため)。