Friend classes and methods

Hello experts!

To declare method of class A a friend of class B this method needs to be declared above declaration of class B.

To declare entire class A a friend of class B class A does not need to be declared above declaration of class B.

Why does compiler works this way, what logic is behind it?

#include <iostream>
using namespace std;

class X;

class Y {
public:
  void print(X& x);
};

class X {
  int a, b;
  friend void Y::print(X& x);
  	  	  	  	
public:
  X() : a(1), b(2) { }
};

void Y::print(X& x) {
  cout << "a is " << x.a << endl;
  cout << "b is " << x.b << endl;
}

int main() {
  X xobj;
  Y yobj;
  yobj.print(xobj);
}

Open in new window


#include <iostream>
using namespace std;

class X {
  int a, b;
  friend class F;
public:
  X() : a(1), b(2) { }
};

class F {
public:
  void print(X& x) {
    cout << "a is " << x.a << endl;
    cout << "b is " << x.b << endl;
  }
};

int main() {
  X xobj;
  F fobj;
  fobj.print(xobj);
}

Open in new window

panJamesAsked:
Who is Participating?
 
ZoppoConnect With a Mentor Commented:
Hi panJames,

it is not possible to use something with friend which the compiler doesn't know yet. The second sample with friend class F; works because the compiler treats this as a forward declaration of the class F. But there's no way to do something similar to a forward declaration for class methods, so the first sample can only work if Y is completeley with all methods nad members declared before X.

Hope that helps,

ZOPPO
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.