#include <iostream>
using namespace std;
class B;
class A
{
friend class B;
public:
void publicMethod();
private:
void privateMethod();
};
class B
{
friend void A::publicMethod();
friend void A::privateMethod();
private:
void foo();
};
void A::publicMethod()
{
B b;
cout << "public ";
b.foo();
privateMethod();
}
void A::privateMethod()
{
B b;
cout << "private ";
b.foo();
}
void B::foo()
{
cout << "foo\n";
}
int main()
{
A a;
a.publicMethod();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQjsKCmNsYXNzIEEKewpmcmllbmQgY2xhc3MgQjsKcHVibGljOgogIHZvaWQgcHVibGljTWV0aG9kKCk7CnByaXZhdGU6CiAgdm9pZCBwcml2YXRlTWV0aG9kKCk7Cn07CgpjbGFzcyBCCnsKZnJpZW5kIHZvaWQgQTo6cHVibGljTWV0aG9kKCk7CmZyaWVuZCB2b2lkIEE6OnByaXZhdGVNZXRob2QoKTsKcHJpdmF0ZToKICB2b2lkIGZvbygpOwp9OwoKdm9pZCBBOjpwdWJsaWNNZXRob2QoKQp7CglCIGI7Cgljb3V0IDw8ICJwdWJsaWMgIjsKCWIuZm9vKCk7Cglwcml2YXRlTWV0aG9kKCk7Cn0KCnZvaWQgQTo6cHJpdmF0ZU1ldGhvZCgpCnsKCUIgYjsKCWNvdXQgPDwgInByaXZhdGUgIjsKCWIuZm9vKCk7Cn0KCnZvaWQgQjo6Zm9vKCkKewogIGNvdXQgPDwgImZvb1xuIjsKfQppbnQgbWFpbigpCnsKCUEgYTsKCWEucHVibGljTWV0aG9kKCk7CglyZXR1cm4gMDsKfQ==