OOPortal OOPortal


Operator Overloading  «Prev

Privileged Access to more than One Class

A function multiplying a vector by a matrix, as represented by these two classes, could be written efficiently if it had access to the private members of both classes. It would be a friend function of both classes.

class matrix;      //forward reference

class vect {
public:
   friend vect  mpy(const vect& v, const matrix& m);
   .....
private:
   int*  p;
   int   size;
};

class matrix {
public:
   friend vect  mpy(const vect& v, const matrix& m);
   .....
private:
   int**   p;
   int     s1, s2;
};

vect mpy(const vect& v, const matrix& m){
   assert(v.size == m.s1);    //check sizes
   //use privileged access to p in both classes
   vect  ans(m.s2);
   int   i, j;
    
   for (i = 0; i <= m.s2; ++i) {
      ans.p[i] = 0;
      for (j = 0; j <= m.s1(); ++j)
         ans.p[i] += v.p[j] * m.p[j][i];
   }
   return ans;
}

A minor point is that a forward declaration of the class matrix is necessary. This is because the function mpy() must appear in both classes, and it uses each class as an argument type.