Почему нужно упомянуть объект в функции друга? - PullRequest
0 голосов
/ 30 апреля 2020

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

#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();
}

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

Ответы [ 2 ]

4 голосов
/ 30 апреля 2020

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

object_arg.name_of_member_function(regular_args);

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

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

name_of_function(regular_args);

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


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

4 голосов
/ 30 апреля 2020

A 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)

или

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