#include <iostream>
using namespace std;
class ClassOne
{
int m_i;
public:
ClassOne(int i = 0) : m_i(i)
{ }
int I() const { return m_i; }
static ClassOne ValueOne;
static ClassOne ValueTwo;
};
ClassOne ClassOne::ValueOne = 1;
ClassOne ClassOne::ValueTwo = 2;
class ClassTwo
{
char m_c;
ClassOne m_member;
private:
ClassTwo(char c = 'A') : m_c(c)
{ }
public:
ClassTwo(const ClassOne &member, char c = 'A') : m_c(c), m_member(member)
{ }
char C() const { return m_c; }
const ClassOne Member() const { return m_member; }
static ClassTwo ValueA;
static ClassTwo ValueB;
};
ClassTwo ClassTwo::ValueA;
ClassTwo ClassTwo::ValueB;
ostream& operator <<(ostream &op1, const ClassTwo &op2)
{
op1 << op2.C() << " containing " << op2.Member().I();
return op1;
}
class _LetsInit
{
static bool Init();
static bool _hasInit;
};
bool _LetsInit::Init()
{
ClassOne::ValueOne = ClassOne(10);
ClassTwo::ValueA = ClassTwo(ClassOne::ValueOne, 'A');
ClassOne::ValueTwo = ClassOne(20);
ClassTwo::ValueB = ClassTwo(ClassOne::ValueTwo, 'B');
return true;
}
bool _LetsInit::_hasInit = _LetsInit::Init();
int main()
{
cout << ClassTwo::ValueA << endl;
cout << ClassTwo::ValueB << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIENsYXNzT25lCnsKICAgIGludCBtX2k7CnB1YmxpYzoKICAgIENsYXNzT25lKGludCBpID0gMCkgOiBtX2koaSkKICAgIHsgfQogICAgCiAgICBpbnQgSSgpIGNvbnN0IHsgcmV0dXJuIG1faTsgfQogICAgCiAgICBzdGF0aWMgQ2xhc3NPbmUgVmFsdWVPbmU7CiAgICBzdGF0aWMgQ2xhc3NPbmUgVmFsdWVUd287Cn07CgpDbGFzc09uZSBDbGFzc09uZTo6VmFsdWVPbmUgPSAxOwpDbGFzc09uZSBDbGFzc09uZTo6VmFsdWVUd28gPSAyOwoKY2xhc3MgQ2xhc3NUd28KewogICAgY2hhciBtX2M7CiAgICBDbGFzc09uZSBtX21lbWJlcjsKICAgIApwcml2YXRlOgoJQ2xhc3NUd28oY2hhciBjID0gJ0EnKSA6IG1fYyhjKQoJeyB9CnB1YmxpYzoKICAgIENsYXNzVHdvKGNvbnN0IENsYXNzT25lICZtZW1iZXIsIGNoYXIgYyA9ICdBJykgOiBtX2MoYyksIG1fbWVtYmVyKG1lbWJlcikKICAgIHsgfQogICAgCiAgICBjaGFyIEMoKSBjb25zdCB7IHJldHVybiBtX2M7IH0KICAgIGNvbnN0IENsYXNzT25lIE1lbWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fbWVtYmVyOyB9CiAgICAKICAgIHN0YXRpYyBDbGFzc1R3byBWYWx1ZUE7CiAgICBzdGF0aWMgQ2xhc3NUd28gVmFsdWVCOwp9OwoKQ2xhc3NUd28gQ2xhc3NUd286OlZhbHVlQTsKQ2xhc3NUd28gQ2xhc3NUd286OlZhbHVlQjsKCm9zdHJlYW0mIG9wZXJhdG9yIDw8KG9zdHJlYW0gJm9wMSwgY29uc3QgQ2xhc3NUd28gJm9wMikKewogICAgb3AxIDw8IG9wMi5DKCkgPDwgIiBjb250YWluaW5nICIgPDwgb3AyLk1lbWJlcigpLkkoKTsKICAgIHJldHVybiBvcDE7Cn0KCmNsYXNzIF9MZXRzSW5pdAp7CiAgICBzdGF0aWMgYm9vbCBJbml0KCk7CiAgICBzdGF0aWMgYm9vbCBfaGFzSW5pdDsKfTsKCmJvb2wgX0xldHNJbml0OjpJbml0KCkKewogICAgQ2xhc3NPbmU6OlZhbHVlT25lID0gQ2xhc3NPbmUoMTApOwogICAgQ2xhc3NUd286OlZhbHVlQSA9IENsYXNzVHdvKENsYXNzT25lOjpWYWx1ZU9uZSwgJ0EnKTsKICAgIENsYXNzT25lOjpWYWx1ZVR3byA9IENsYXNzT25lKDIwKTsKICAgIENsYXNzVHdvOjpWYWx1ZUIgPSBDbGFzc1R3byhDbGFzc09uZTo6VmFsdWVUd28sICdCJyk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBfTGV0c0luaXQ6Ol9oYXNJbml0ID0gX0xldHNJbml0OjpJbml0KCk7CgppbnQgbWFpbigpCnsKICAgIGNvdXQgPDwgQ2xhc3NUd286OlZhbHVlQSA8PCBlbmRsOwogICAgY291dCA8PCBDbGFzc1R3bzo6VmFsdWVCIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQo=