#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;
}
