2016-12-22 13 views
1

申し訳ありませんが、ひどく定義されたタイトルです。私が何を意味するか:オブジェクトから親オブジェクトの親に効率的にアクセスするにはどうすればいいですか?

(ところで私は、ゲームエンジンに取り組んでいます、そしてAはシーンあり、Bはゲームがオブジェクトであり、Cは、コンポーネント)私は3つのクラスを持っている

:A、B、C

  • AはBを含み、Bは、C
  • Aを含み、Bは、お互いへの参照を有します。
  • BおよびCは、互いに参照を有する。

(AはフォワードBのヘッダにdeclarated、及びBの実装に含まれている)

はこのようなものだ:< - > B < - > C

私の状況はこれです:

  • 私はCのAメソッドを使用したい(別のBなどを追加するようにメインコンテナに伝えるように)

  • 〜私は、親オブジェクトの親でメソッドを呼び出す再利用可能な関数を作りたいと思います。

  • たとえば、Cの派生クラスでは、CがどのようにAに到達するか気にする必要はありません。ちょうどCのReach-A-and-do-somethingメソッドを呼び出します。

私の質問は1つが、私が使用する必要があり、なぜするものである(以上1がある?):Cで

  • :GetB()下駄()doSomethingの(。。 )

  • CのDoSomething()は、AのDoSomethingを呼び出すBのDoSomething()を呼び出します。

最初のものは私にはよりよい見えるが、Cの実装で私はAだけ前進をdeclaratedさBのヘッダを含みます。だから私は明示的にC.でそれを含めず Aのメソッドを使用することはできませんは(これは悪い習慣です、または私はちょうどそれを含める必要があります?)

秒1 大きなオーバーヘッドを持っています。 AのXYメソッドを使用したい場合は、AのXYを呼び出すBのXYメソッドを作成する必要があり、BのXYを呼び出すCのXYメソッドを作成する必要があります。

したがって、下位要素から階層内の上位要素に到達する方法はわかりません。

これに最適な解決策は何ですか?Cにおいて

+0

CファイルにAのヘッダーファイルを追加すると競合が発生しますか? –

+0

'GetB()。GetA()。DoSomething()'が良いと思われます。 CにAを含めることができます。定義と宣言が分離して含まれていることを確認してください。もう一つのオプションは、 'std :: functional'を使ってAの関数でBを初期化し、Cの' std :: functional'変数にもコピーして、Cが 'my_std_functional()'を呼び出せるようにすることです。 A.の何かが – wally

+0

それは正常に動作します。 「定義と宣言は分離して含まれています」についての詳細を教えてください。 すべてのクラスが異なるスコープにある場合、それは問題ありませんか? – Tudvari

答えて

0

:GetB()下駄()のdoSomething()

CさんのdoSomething()はAさんのdoSomethingを呼び出しBの のdoSomething()を呼び出します。。。

私は両方とも間違っていると思うのですが、アーキテクチャの観点からは、このようなアプローチはクラス間の強い結合を作り出します。論理のためにObserverパターンを実装するイベントディスパッチャーの使用を検討してください。コンポーネントがイベントを相互に送信し、それらに反応するようにします。

私はあなたのケースでパフォーマンスがどのように機能するかについてはわかりませんが、明白でない限り、premature optimizationに対して強くお勧めします。

+0

現在、私はすべてのゲームオブジェクトに他のすべてのgameオブジェクトを格納して実装することしかできません。したがって、すべてのゲームオブジェクトはすべてのゲームオブジェクトに到達(通知)できます。しかし、私のアーキテクチャでは、ゲームオブジェクトはゲームオブジェクトがシーンにアクセスする理由の1つの場所(シーン)に格納されます。 (シーンにアクセスすることで、他のゲームオブジェクトにアクセスして通知することができます)。 – Tudvari

関連する問題