views:

87

answers:

3
#include <iostream>

class B;

class A{
 int a;
public:
 friend void B::frndA();
};

class B{
 int b;
public:
 void frndA();
};

void B::frndA(){
 A obj;
 std::cout << "A.a = " << obj.a << std::endl;
}

int main() {
 return 0;
}

When I am trying to compile this code some error occurred. Can anyone explain what are the problems in this code

+2  A: 

Place the whole of the class B ... declaration before class A. You haven't declared B::frndA(); yet.

#include <iostream>
using namespace std;

class B{
    int b;
public:
    void frndA();
};

class A{
    int a;
public:
    friend void B::frndA();
};



void B::frndA(){
    A obj;
    //cout<<"A.a = "<<obj.a<<endl;
}

int main() {
    return 0;
}
Duracell
A: 

You need to put the declaration of B before A. The compiler doesn't know about this: B::frndA(). A forward declaration is not enough information to infer what members the type has.

I would recommend to put your class A declaration in a file A.h and it's definition inside a file A.cpp. Likewise the same for the type B inside of B.h and B.cpp

At the top of each header file put #pragma once (or if you prefer include guards).

Then inside your B.h you can simply include A.h.

Brian R. Bondy
I suggest `#ifndef FOO_H` `#define FOO_H` ... `#endif` instead of `#pragma once`.
Bertrand Marron
In fact, pragma once can fail when the same file falls within different search paths since it's based on the path and not on the content of the file.
Noah Roberts
pragma once is supported by all major compilers. I don't think #pragma once warrants the down vote. See here: http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards/1143958#1143958
Brian R. Bondy
Indeed, it does.
Noah Roberts
+1  A: 

The problem is you can't friend a member function before the compiler has seen the declaration.

You are going to need to rearrange your code to solve the problem (i.e. move the definition of class B prior to class A).

R Samuel Klatchko