[comp.lang.c++] wanting to be a `friend' of a derived class

peter@mit-amt.MEDIA.MIT.EDU (Peter Schroeder) (09/19/89)

// I want `another' to have access to the private part of `derived'
// which, under cfront 1.2, I can apparently only get by making `another' friend
// to the base class.

// this program produces:

// make test
//    CC  -O  -n -o test test.C
// CC  test.C:
// "test.C", line 32: error:  a is protected 
// 1 error
// *** Error code 1

// Stop.


#include	<stream.h>

class base{
protected:
   int a;
public:
   base() : a( 1 ) {}
   // friend class another;        this is what it takes to work. Why?
};

class derived : private base{
public:
   // friend int another::mult();  this is really what I want
   friend class another;           // but I'd settle for this
   derived() : () {}
};

class another{
   int b;
public:
   another() : b( 1 ) {}
   int mult( derived& d )
      { return b * d.a; }          // I need it here
};

main()
{
   another a;
   derived d;

   cout << a.mult( d ) << "\n";
}

// Notice that this is simplified considerably from the actual problem where I
// really need the friend mechanism, rather then a function such as
//    int derived::geta() { return a; }
// which obviously would also solve my problem.

// What am I overlooking?

// Thanks for your help!

// Peter
// peter@media-lab.media.mit.edu
*/

shopiro@alice.UUCP (Jonathan Shopiro) (09/19/89)

The summary says it all.  Under C++ 2.0, friend functions have exactly
the same access rights as member functions of the same class.
-- 
		Jonathan Shopiro
		AT&T Bell Laboratories, Warren, NJ  07060-0908
		research!shopiro   (201) 580-4229