Is there any way around this:
class B;
class C {
public:
C() { }
private:
int i;
friend B::B();
};
class B {
public:
B() { }
private:
int i;
friend C::C();
};
Gives error:
prog.cpp:8: error: invalid use of incomplete type ‘struct B’
prog.cpp:1: error: forward declaration of ‘struct B’
You just can't do this. Remove the circular dependency.
According to IBM's documentation (which I realize is not normative):
A class Y must be defined before any member of Y can be declared a friend of another class.
So I think the answer is "no".
Of course, you can use
friend class B;
...instead of friend B::B()
, but that grants friendship to all of B's members. And you probably already knew that.
Since you're very selective about friendship (access to specific member functions given to specific classes), the Attorney-Client Idiom may be what you need. I'm not sure how well this will work with constructors, though.
I realize that this is a really silly idea, but couldn't you—theoretically—accomplish this through inheritance, by making the parent class' constructors friends? The code compiles, at least, questionable though it may be.
class A {
public:
A() { }
private:
int i;
};
class D {
public:
D() { }
private:
int i;
};
class B : public A {
public:
B() { }
private:
friend D::D();
};
class C : public D {
public:
C() { }
private:
friend A::A();
};
来源:https://stackoverflow.com/questions/6158760/recursive-friend-classes