Обычно вы хотите, чтобы перегрузка operator<<()
была «свободной функцией» (вне вашего класса), чтобы она могла естественно связываться с потоком:
// this is outside your class definition
std::ostream& operator<<(std::ostream& os, const myclass& rhs)
{
// whatever...
return os;
}
Затем внутри вашего класса вы объявляетеfriend
если необходимо, чтобы он мог добраться до внутренних объектов класса:
friend std::ostream& operator<<(std::ostream& os, const myclass& rhs);
Альтернативой этому будет friend
(что некоторые люди считают нарушением инкапсуляции) - иметь публичную функцию вваш класс, который будет выводить себя в поток и вызывать его при вашей перегрузке operator<<()
:
// inside class myclass - a normal public member function
std::ostream& dump( std::ostream& os)
{
os << some_class_member;
// ...
return os;
}
// now, the `operator<<()` overload doesn't need to be a friend
// this is still outside your class definition
std::ostream& operator<<(std::ostream& os, const myclass& rhs)
{
return rhs.dump(os);
}