Making friends

The problem with the code above is that the cartesian_vector class accesses private members of the point class. Since we have written both classes, we are happy to bend the rules, and so we make the cartesian_vector class a friend of the point class:

    class cartesian_vector; // forward decalartion 

class point
{
double x; double y;
public:
point(double x, double y) : x(x), y(y){}
friend class cartesian_point;
};

Since the cartesian_vector class is declared after the point class, we have to provide a forward declaration that essentially tells the compiler that the name cartesian_vector is about to be used and it will be declared elsewhere. The important line starts with friend. This indicates that the code for the entire class, cartesian_vector, can have access to the private members (data and methods) of the point class.

You can also declare friend functions. For example, you could declare an operator such that a point object can be inserted into the cout object, so it can be printed to the console. You cannot change the ostream class, but you can define a global method:

    ostream& operator<<(ostream& stm, const point& pt) 
{
stm << "(" << pt.x << "," << pt.y << ")";
return stm;
}

This function accesses the private members of point so you have to make the function a friend of the point class with:

    friend ostream& operator<<(ostream&, const point&);

Such friend declarations have to be declared in the point class, but it is irrelevant whether it is put in the public or private section.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset