Сообщение Re[7]: Почему нельзя предварительно объявить дружественную ф от 26.09.2023 16:53
Изменено 26.09.2023 16:56 B0FEE664
Re[7]: Почему нельзя предварительно объявить дружественную функ
Здравствуйте, Евгений Музыченко, Вы писали:
BFE>>вы хотите объявить другом класса закрытый (приватный) метод другого класса?
ЕМ>Нет, открытый. Проблема лишь в том, что язык не дает мне заранее объявить этот метод — хоть во friend, хоть независимо, и я пытаюсь понять, почему.
Почему компиляторы такие — я не знаю, однако замечу, что вызов публичного невиртуального метода класса равносилен вызову дружественной функции с передачей в качестве первого параметра указателя на объект. Т.е. вызовы x.method() и method(&x) столь мало различаются, что заострять на этом внимание как-то странно. Поэтому пример приведённый so5team мне кажется адекватной заменой.
Никакой разнице в доступе между этим
и этим:
нет.
И ещё: дружественные функции вообще не нужны. Я знаю ровно одно реальное применение — это boost::intrusive_ptr, но и то, дружественные функции там потребовались исключительно для экономии времени ипространста памяти.
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 мне кажется адекватной заменой.
Никакой разницы в доступе между этим
и этим:
нет.
И ещё: дружественные функции вообще не нужны. Я знаю ровно одно реальное применение — это boost::intrusive_ptr, но и то, дружественные функции там потребовались исключительно для экономии времени ипространста памяти.
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, но и то, дружественные функции там потребовались исключительно для экономии времени и