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
You just can't do this. Remove the circular dependency.
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();
};
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.