2

フレンド関数がメンバー関数よりも確実に優れている場合、体は私に1つの条件を与えることができますか? または、メンバー関数ではなくフレンド関数を使用するいくつかの理由があります。どうもありがとうございました。

4

4 に答える 4

0

オブジェクト指向設計の基礎の 1 つは、オブジェクトがメッセージを送信して対話することです。メッセージを送信するには (この場合はメンバー関数を呼び出します)、オブジェクトはターゲット オブジェクトへの「リンク」を持っている必要があります。このリンクは、型の定義の一部として 2 つのクラス間の関連付けを構築することによって形成されます。

ピア ツー ピアの関係では、いずれかのオブジェクトが他方の操作を呼び出すことができます。つまり、関係は双方向です。

関連が双方向の場合、両方のクラスにポインターが必要です。オブジェクトを一緒にバインドする必要があるときに問題が発生します。問題は、どのオブジェクトが最初に構築されるかです。両方のクラスが動作するためにコンストラクター内で他のクラスへの参照が必要な場合、循環依存関係があります。

おそらく最も洗練されたアプローチは、2 つのオブジェクトを結合するフリー関数を作成することです。「bind」関数は、両方のクラスのフレンドになり、それらのポインターの接続を許可します (それ以外の方法でそれらを公開することはありません)。

class CameraStabiliser;

class UI
{
private:
  CameraStabiliser* pStabiliser;

public:
  UI() : pStabiliser(NULL) {}
  void inPosition();

  friend void bind(UI& ui, CameraStabiliser& cs);
};


class CameraStabiliser
{
private:
  UI* pUI;

public:
  CameraStabiliser() : pUI(NULL) {}
  void moveTo(Position pos);

  friend void bind(UI& ui, CameraStabiliser& cs);
};


void bind(UI& ui, CameraStabiliser& cs)
{
  ui.pStabiliser = &cs;
  cs.pUI = &ui;
}


int main()
{
  UI console;
  CameraStabiliser stabiliser;

  bind(console, stabiliser);
}
于 2013-05-30T15:45:07.740 に答える