1

ここにクラスがあります

class Instructor
{
 public:

Instructor ( int id , string name ) ;// constructor
 ~Instructor ()                       ;

// methods
string               getName           () ;
int                  getID             () ;



private:

int                  id             ;
string               name           ;

friend ostream & operator<< ( ostream & out , Instructor & instructor ) ;
 } ;

ここにostream関数があります

 ostream & operator<< ( ostream & out , Instructor & instructor )
{
out <<  "ID:" << instructor.getID() << "\t  NAME:" << instructor.getName() << "\t OFFERED_COURSES:" ;


return out << endl ;

}

ここに getname メソッドと getID メソッドがあります

  string Instructor::getName ()
{
  return this->name ;
}


int Instructor::getID ()
{
  return this->id ;
}

私の質問は、なぜ getID 関数と getname 関数を使用する必要があるのか​​ということです。"this->name" と書いて name にアクセスすることはできませんか? 回答ありがとうございます。

4

4 に答える 4

4

必要なし、推奨あり。実際、宣言する必要はまったくなくfriend、よりカプセル化されています。

于 2012-10-18T16:40:17.740 に答える
3

おそらく、「できない」というよりも「すべきではない」ということです。現時点でgetID()は、基になる変数を返すだけですが、別の表現に変更されないという保証はありません。カプセル化に遭遇した場合は、カプセル化を尊重してください。

于 2012-10-18T16:41:33.407 に答える
0

いいえ、フレンドは実際にはクラスの実装の拡張部分であるため、直接アクセスできます。

関数またはクラスを実装の詳細の一部ではないフレンドとして宣言した場合、それはおそらくフレンドの不適切な使用です。

あなたの場合、実際にはストリーミング フレンドのオーバーロードを完全に削除できますが、クラスがストリーミング インもサポートし、セッター関数 (またはスワップ) もサポートしたくないと判断した場合、残りのオプションは 1 つしかありません。メンバー変数に直接書き込む友達としてストリームインすること。

(ストリームインが失敗した場合、オブジェクトをデフォルトの (新しく構築された) 状態のままにする必要があることに注意してください。

stream-out は、通常は直接アクセスを提供しないストリーム メンバーに書き込む必要がある場合 (できればその場合にのみ) フレンドにする必要があります。

于 2012-10-18T16:46:36.923 に答える
0

それを行うことはできますが (フレンド関数でプライベート メンバーに直接アクセスする)、最善の方法ではありません。インスペクター関数を使用して、クラスが外部で使用されるように記述されているように、クラスのプライベート状態を公開するように記述する必要があります。実際のプライベート フィールドは、クラスが内部で行う必要があることを行うためにそれ自体を使用するためにあります

演算子関数でプライベート メンバーを使用していないため、フレンドにする必要さえありません。

于 2012-10-18T16:41:53.523 に答える