Re: Private Member Access failed through Friend function
Richard Smith wrote:
By the way, you may hear people saying that friends are always bad and
that you should always implement operator<< in terms of a public print()
function. Don't believe them! Yes, it is true that friend functions
can be overused and can result in broken encapsulation, but that's not
the same as saying that all friend functions are signs of bad design.
IMHO a friend operator<< is better better than introducing an
unnecessary print() function. That said, if you can implement
operator<< through the public interface of the class *without* injecting
an additional print() function, that's much better still!
I agree, but I'd also like to point out a situation where defining a
separate print() function would be useful: polymorphic classes. Because
calls to operator<< cannot be dispatched virtually depending on the
right-hand side operand, defining virtual print() functions and calling
that of the base class in operator<<(std::ostream&, const Base&) is
almost "the" right answer.
class Base
{
public:
virtual void print(std::ostream&) /* = 0 as necessary */;
};
std::ostream& operator<<(std::ostream& os, const Base& b)
{ b.print(os); return os; }
class Derived1 : public Base
{
public:
virtual void print(std::ostream&);
};
class Derived2 : public Base
{
public:
virtual void print(std::ostream&);
};
--
Seungbeom Kim
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]