#include <iostream>
using namespace std;
//secondClass needs to know the type firstClass exists to take it as an argument to the ctor
class firstClass;
class secondClass
{
public:
secondClass(int val = 0): value(val){}
secondClass(const firstClass& fc); //Just declare that this function exists
int getValue()
{
return value;
}
int value;
};
class firstClass
{
private:
int value;
//Since this function is declared, this works
friend secondClass::secondClass(const firstClass& fc);
public:
firstClass(int val = 0): value(val){}
};
//Finally, now that firstClass is implemented, we can implement this function
secondClass::secondClass(const firstClass& fc)
{
value = fc.value;
}
int main()
{
firstClass fc(5);
secondClass sc(fc);
cout<<sc.value;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vc2Vjb25kQ2xhc3MgbmVlZHMgdG8ga25vdyB0aGUgdHlwZSBmaXJzdENsYXNzIGV4aXN0cyB0byB0YWtlIGl0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBjdG9yCmNsYXNzIGZpcnN0Q2xhc3M7CgpjbGFzcyBzZWNvbmRDbGFzcwp7ICAgCiAgcHVibGljOgogICAgc2Vjb25kQ2xhc3MoaW50IHZhbCA9IDApOiB2YWx1ZSh2YWwpe30KICAgIHNlY29uZENsYXNzKGNvbnN0IGZpcnN0Q2xhc3MmIGZjKTsgLy9KdXN0IGRlY2xhcmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGV4aXN0cwoKICAgIGludCBnZXRWYWx1ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIGludCB2YWx1ZTsKfTsKCmNsYXNzIGZpcnN0Q2xhc3MKewpwcml2YXRlOgogICAgaW50IHZhbHVlOwoKICAgIC8vU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCwgdGhpcyB3b3JrcwogICAgZnJpZW5kIHNlY29uZENsYXNzOjpzZWNvbmRDbGFzcyhjb25zdCBmaXJzdENsYXNzJiBmYyk7CnB1YmxpYzoKICAgIGZpcnN0Q2xhc3MoaW50IHZhbCA9IDApOiB2YWx1ZSh2YWwpe30KCn07CgovL0ZpbmFsbHksIG5vdyB0aGF0IGZpcnN0Q2xhc3MgaXMgaW1wbGVtZW50ZWQsIHdlIGNhbiBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbgpzZWNvbmRDbGFzczo6c2Vjb25kQ2xhc3MoY29uc3QgZmlyc3RDbGFzcyYgZmMpCnsKICAgIHZhbHVlID0gZmMudmFsdWU7Cn0KCmludCBtYWluKCkKewogICAgZmlyc3RDbGFzcyBmYyg1KTsKICAgIHNlY29uZENsYXNzIHNjKGZjKTsKCiAgICBjb3V0PDxzYy52YWx1ZTsKCn0=