Почему необходимо упоминать объект в функции друга?

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

#include <iostream>
#include <vector>
using namespace std;
class project
{
  private:
  vector<int> v1;
  public:
    void addelement(int a)
    {
      v1.push_back(a);

    }

    void view()
    {
      for(auto i=v1.begin();i<v1.end();i++)
      {
        cout<<*i<<endl;
      }
    }

    friend void modify(int,int,project);

};

void modify(int data,int index,project p)//is it necessary here to make an object of class .
    {
      p.v1[index]=data;//As here without "p." it shows errors,it says use 
                        //of unidentified identifier v1
    }

int main()
{
  project p1;
  p1.addelement(7);
  p1.addelement(91);
  modify(24,0,p1);
  modify(22,3,p1);
  p1.view();
}

Интересно, если функция друга является другом класса и может самостоятельно обращаться к закрытым членам класса, то зачем нужно упоминать объект этого класса?


person Gautam Goyal    schedule 30.04.2020    source источник
comment
Кстати, вы передаете project p по значению в modify, поэтому его изменения не отражаются в p1. Вам нужно передать его по ссылке (project& p)   -  person Kevin    schedule 30.04.2020


Ответы (2)


Функция friend не является функцией-членом этого класса.

Как modify(24,0) узнать, о каком экземпляре project вы говорите? После этого вам нужно передать экземпляр project этой функции friend.

Дополнительное примечание: void modify(int data, int index, project p) создает копию p, если вы хотите изменить объект, который вы передаете modify, вам нужно либо написать:

void modify(int data, int index, project &p) {
  p.v1[index]=data;
}
//...
modify(24,0,p1)

or

void modify(int data, int index, project *p) {
  p->v1[index]=data;
}
//...
modify(24,0,&p1)
person t.niese    schedule 30.04.2020
comment
Но здесь он показывает результат правильно, поэтому я думаю, что здесь нам не нужна ссылка на объект, И если да, то в каких условиях нам нужно передать ссылку на объект? Пожалуйста, объясните. Спасибо!! - person Gautam Goyal; 30.04.2020
comment
@Gautam Но здесь результат отображается правильно где? - person JohnFilleau; 30.04.2020
comment
@GautamGoyal Я почти уверен, что это не показывает правильный результат. Кроме того, modify(22,3,p1); приводит к неопределенному поведению. - person t.niese; 30.04.2020
comment
вы можете попробовать запустить мою программу - person Gautam Goyal; 30.04.2020
comment
извините, я проверил это еще раз, и вы были правы, это не изменяет значения. Большое спасибо !! - person Gautam Goyal; 30.04.2020

Для такого объекта вызываются только нестатические функции-члены:

object_arg.name_of_member_function(regular_args);

Таким образом, нестатические функции-члены имеют доступ к указателю this, указывающему на object_arg, и неявно к членам объекта, на который указывает this.

Все остальные функции, состоящие из статических функций-членов и свободных функций, включая те бесплатные функции, которые являются друзьями такого класса, как ваш modify, вызываются без объектного аргумента следующим образом:

name_of_function(regular_args);

Таким образом, у них нет указателя this. Если вы хотите получить доступ к какому-то объекту, вы должны передать его как обычный аргумент.


P.S. Изменение аргумента, переданного по значению, в большинстве случаев бесполезно.

person eerorika    schedule 30.04.2020