Информация об изменениях

Сообщение Re[7]: Почему нельзя предварительно объявить дружественную ф от 26.09.2023 16:53

Изменено 26.09.2023 16:56 B0FEE664

Re[7]: Почему нельзя предварительно объявить дружественную функ
Здравствуйте, Евгений Музыченко, Вы писали:

BFE>>вы хотите объявить другом класса закрытый (приватный) метод другого класса?

ЕМ>Нет, открытый. Проблема лишь в том, что язык не дает мне заранее объявить этот метод — хоть во friend, хоть независимо, и я пытаюсь понять, почему.

Почему компиляторы такие — я не знаю, однако замечу, что вызов публичного невиртуального метода класса равносилен вызову дружественной функции с передачей в качестве первого параметра указателя на объект. Т.е. вызовы x.method() и method(&x) столь мало различаются, что заострять на этом внимание как-то странно. Поэтому пример приведённый so5team мне кажется адекватной заменой.
Никакой разнице в доступе между этим
class A;
class B;

class B
{
  public: void AccessToA(A& a);
};

class A 
{
  friend void B::AccessToA(A& a);
  private: int m_iA{0};  
};

void B::AccessToA(A& a)
{
    std::cout << a.m_iA << std::endl;
}

int main()
{
    A a;
    B b;
    b.AccessToA(a);
    return 0;
}

и этим:
class A;
class B;

class A 
{
  friend void AccessToA(B* b, A& a);
  private: int m_iA{0};  
};


class B
{
  friend void AccessToA(B* b, A& a);
};

void AccessToA(B*, A& a)
{
    std::cout << a.m_iA << std::endl;
}

int main()
{
    A a;
    B b;
    AccessToA(&b, a);
    return 0;
}

нет.

И ещё: дружественные функции вообще не нужны. Я знаю ровно одно реальное применение — это boost::intrusive_ptr, но и то, дружественные функции там потребовались исключительно для экономии времени и пространста памяти.
Re[7]: Почему нельзя предварительно объявить дружественную ф
Здравствуйте, Евгений Музыченко, Вы писали:

BFE>>вы хотите объявить другом класса закрытый (приватный) метод другого класса?

ЕМ>Нет, открытый. Проблема лишь в том, что язык не дает мне заранее объявить этот метод — хоть во friend, хоть независимо, и я пытаюсь понять, почему.

Почему компиляторы такие — я не знаю, однако замечу, что вызов публичного невиртуального метода класса равносилен вызову дружественной функции с передачей в качестве первого параметра указателя на объект. Т.е. вызовы x.method() и method(&x) столь мало различаются, что заострять на этом внимание как-то странно. Поэтому пример приведённый so5team мне кажется адекватной заменой.
Никакой разницы в доступе между этим
class A;
class B;

class B
{
  public: void AccessToA(A& a);
};

class A 
{
  friend void B::AccessToA(A& a);
  private: int m_iA{0};  
};

void B::AccessToA(A& a)
{
    std::cout << a.m_iA << std::endl;
}

int main()
{
    A a;
    B b;
    b.AccessToA(a);
    return 0;
}

и этим:
class A;
class B;

class A 
{
  friend void AccessToA(B* b, A& a);
  private: int m_iA{0};  
};


class B
{
  friend void AccessToA(B* b, A& a);
};

void AccessToA(B*, A& a)
{
    std::cout << a.m_iA << std::endl;
}

int main()
{
    A a;
    B b;
    AccessToA(&b, a);
    return 0;
}

нет.

И ещё: дружественные функции вообще не нужны. Я знаю ровно одно реальное применение — это boost::intrusive_ptr, но и то, дружественные функции там потребовались исключительно для экономии времени и пространста памяти.