Функция, которая является «другом класса», которой разрешено иметь «доступ на чтение» к своим «закрытым членам», но НЕ «доступ на запись»? - PullRequest
2 голосов
/ 15 ноября 2011

Привет всем, кто прочитал

Я изучаю C ++ из учебника:

Вопрос в учебнике просит меня сделать функцию другом класса, и, следовательно, функция друга может иметь доступ ко всем членам класса; это нормально, я могу это сделать. Проблема заключается в том, что затем возникает вопрос, что функция друга может только читать членов класса (частных членов), но НЕ писать им!

** Обратите внимание: я смотрел на похожие вопросы / ответы по «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...

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

Функция, являющаяся «другом класса», которой разрешено иметь «доступ на чтение» к своим «закрытым членам», но НЕ «доступ на запись»?

Как только вы объявляете функцию как функцию друга, правила спецификатора доступа отключаются, но вы можете запретить запись в члены, передав объект const в функцию друга.

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

Обратите внимание, что access specifiers и const ness - это два разных атрибута, не смешивайте их.

Обратите внимание, что ваша функция-друг все еще может попытаться изменить объект, отбрасывая constness объекта с помощью const_cast, но это приведет к неопределенному поведению в соответствии со стандартом.

1 голос
/ 15 ноября 2011

Вы захотите прочитать о «постоянстве», включая постоянные переменные, параметры и функции-члены.

В частности, вы можете указать, что функция друга получает свой параметр в качестве const ссылки. Он сможет только читать приватные переменные и вызывать константные функции.

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

void readers(classroom const &lee) {
    // ...
}
...