2

読んだすべての人にこんにちは

私は教科書からC++を独学しています:

教科書の質問では、関数をクラスのフレンドにするように求められているため、フレンド関数はすべてのクラスメンバーにアクセスできます。私はこれを行うことができます。問題は、その後、friend関数がクラスメンバー(プライベートメンバー)のみを読み取ることができ、それらに書き込むことはできないという質問が続くことです。

**注意:「stackoverflow」で同様の質問/回答を確認しましたが、私が求めている関連性のある単純でわかりやすい回答は見つかりませんでした。

これが私が持っているいくつかの関連するコードです、どんな助けもいただければ幸いです:

よろしくお願いします

#include <iostream>
#include <cstdio>

using namespace std;

class classroom{

  private:
         char name[25];
         int student_id;
         float grades[10];
         float average;
         int num_tests;
         float letter_grade;
         static int last_student_id;
  public:       
         void enter_name_id(void);
         void enter_grade(void);
         void average_grades(void);
         void letter_grades(void);
         void output_name_id_grade(void);
         void last_id(void);
         classroom();


  friend void readers(classroom&);

  };

      int classroom::last_student_id=1;



   void readers(classroom& lee){ 

      cout<<"\n number tests: "<<lee.num_tests;//friend function is reading class member -This is O.K!

      lee.num_tests=15;//friend function is writing to class member - We don't want this to be allowed

      cout<<"\n number tests: "<<lee.num_tests;//Used to test that class members are NOT accessed!             



   } 

メインプログラムには次のものがあります。

int main()
{       

        classroom students[10];
        readers(students[0]);

//and so on...
4

2 に答える 2

5

「プライベートメンバー」への「読み取りアクセス」は許可されているが「書き込みアクセス」は許可されていない「クラスのフレンド」である関数?

関数をフレンド関数として宣言すると、アクセス指定子のルールはオフになりますが、constオブジェクトをフレンド関数に渡すことでメンバーへの書き込みを防ぐことができます。

friend void readers(const classroom&);
                    ^^^^^

access specifiersとnessは2つの異なる属性であることに注意してくださいconst。これらを混在させないでください。

フレンド関数は、constnessを使用してオブジェクトのをキャストすることでオブジェクトを変更しようとすることができますconst_castが、その結果、標準に従って未定義の動作が発生することに注意してください。

于 2011-11-15T18:59:03.147 に答える
1

定数変数、パラメーター、メンバー関数など、「定数」について読みたいと思うでしょう。

具体的には、friend関数がそのパラメーターをconst参照として受け取るように指定できます。プライベート変数を読み取り、const関数を呼び出すことしかできません。

// ...
friend void readers(classroom const &);
// ...

void readers(classroom const &lee) {
    // ...
}
于 2011-11-15T19:02:51.620 に答える