#include <stdio.h>
enum EmptyConstructor
{
_EmptyConstructor
};
class Foo
{
int m_ValueFoo;
public:
Foo() : m_ValueFoo( 0 ){ printf("Foo()\n"); }
Foo(EmptyConstructor e){(void)e;}
void Initialize( int value )
{
m_ValueFoo = value;
}
int GetValue( void ) const { return m_ValueFoo; }
};
class A
{
Foo m_ValueA;
public:
A(){ printf("A()\n"); }
A(EmptyConstructor e) : m_ValueA(e) {}
void Initialize( int value )
{
m_ValueA.Initialize( value );
}
int GetValueA( void ) const { return m_ValueA.GetValue(); }
};
class B : public A
{
Foo m_ValueB;
public:
B(){ printf("B()\n"); }
B(EmptyConstructor e) : A(e), m_ValueB(e) {}
void Initialize( int value )
{
m_ValueB.Initialize( value );
A::Initialize( value ); // 基底クラスを後から初期化
}
int GetValueB( void ) const { return m_ValueB.GetValue(); }
};
class C : public B
{
Foo m_ValueC_1;
Foo m_ValueC_2;
public:
C(){ printf("C()\n"); }
C(EmptyConstructor e) : B(e), m_ValueC_1(e), m_ValueC_2(e) {}
void Initialize( int value )
{
m_ValueC_2.Initialize( value ); // 2番目のメンバ変数の初期化
B::Initialize( value ); // 基底クラスの初期化
m_ValueC_1.Initialize( value ); // 1番目のメンバ変数の初期化
}
int GetValueC1( void ) const { return m_ValueC_1.GetValue(); }
int GetValueC2( void ) const { return m_ValueC_2.GetValue(); }
};
int main( void )
{
// デフォルトコンストラクタによる初期化
{
C c;
printf( "%d,%d,%d,%d\n", c.GetValueA(), c.GetValueB(), c.GetValueC1(), c.GetValueC2() );
}
// 自由な初期化(Initialize関数)
{
C c( _EmptyConstructor );
c.Initialize( 9 );
printf( "%d,%d,%d,%d\n", c.GetValueA(), c.GetValueB(), c.GetValueC1(), c.GetValueC2() );
}
// べつの引数で。
{
C c( _EmptyConstructor );
c.Initialize( 1111 );
printf( "%d,%d,%d,%d\n", c.GetValueA(), c.GetValueB(), c.GetValueC1(), c.GetValueC2() );
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgplbnVtIEVtcHR5Q29uc3RydWN0b3IKewoJX0VtcHR5Q29uc3RydWN0b3IKfTsKCmNsYXNzIEZvbwp7CglpbnQgbV9WYWx1ZUZvbzsKcHVibGljOgoJRm9vKCkgOiBtX1ZhbHVlRm9vKCAwICl7IHByaW50ZigiRm9vKClcbiIpOyB9CiAgICBGb28oRW1wdHlDb25zdHJ1Y3RvciBlKXsodm9pZCllO30KICAgIHZvaWQgSW5pdGlhbGl6ZSggaW50IHZhbHVlICkKICAgIHsKICAgIAltX1ZhbHVlRm9vID0gdmFsdWU7CiAgICB9CiAgICBpbnQgR2V0VmFsdWUoIHZvaWQgKSBjb25zdCB7IHJldHVybiBtX1ZhbHVlRm9vOyB9Cn07CgpjbGFzcyBBCnsKCUZvbyBtX1ZhbHVlQTsKcHVibGljOgoJQSgpeyBwcmludGYoIkEoKVxuIik7IH0KICAgIEEoRW1wdHlDb25zdHJ1Y3RvciBlKSA6IG1fVmFsdWVBKGUpIHt9CiAgICB2b2lkIEluaXRpYWxpemUoIGludCB2YWx1ZSApCiAgICB7CiAgICAJbV9WYWx1ZUEuSW5pdGlhbGl6ZSggdmFsdWUgKTsKICAgIH0KICAgIGludCBHZXRWYWx1ZUEoIHZvaWQgKSBjb25zdCB7IHJldHVybiBtX1ZhbHVlQS5HZXRWYWx1ZSgpOyB9Cn07CgpjbGFzcyBCIDogcHVibGljIEEKewogIAlGb28gbV9WYWx1ZUI7CnB1YmxpYzoKCUIoKXsgcHJpbnRmKCJCKClcbiIpOyB9CiAgICBCKEVtcHR5Q29uc3RydWN0b3IgZSkgOiBBKGUpLCBtX1ZhbHVlQihlKSB7fQogICAgdm9pZCBJbml0aWFsaXplKCBpbnQgdmFsdWUgKQogICAgewogICAgCW1fVmFsdWVCLkluaXRpYWxpemUoIHZhbHVlICk7CiAgICAgICAgQTo6SW5pdGlhbGl6ZSggdmFsdWUgKTsgLy8g5Z+65bqV44Kv44Op44K544KS5b6M44GL44KJ5Yid5pyf5YyWCiAgICB9CiAgICBpbnQgR2V0VmFsdWVCKCB2b2lkICkgY29uc3QgeyByZXR1cm4gbV9WYWx1ZUIuR2V0VmFsdWUoKTsgfQp9OwoKY2xhc3MgQyA6IHB1YmxpYyBCCnsKICAJRm9vIG1fVmFsdWVDXzE7CiAgICBGb28gbV9WYWx1ZUNfMjsKcHVibGljOgoJQygpeyBwcmludGYoIkMoKVxuIik7IH0KICAgIEMoRW1wdHlDb25zdHJ1Y3RvciBlKSA6IEIoZSksIG1fVmFsdWVDXzEoZSksIG1fVmFsdWVDXzIoZSkge30KICAgIHZvaWQgSW5pdGlhbGl6ZSggaW50IHZhbHVlICkKICAgIHsKICAgICAgICBtX1ZhbHVlQ18yLkluaXRpYWxpemUoIHZhbHVlICk7IC8vIDLnlarnm67jga7jg6Hjg7Pjg5DlpInmlbDjga7liJ3mnJ/ljJYKICAgICAgICBCOjpJbml0aWFsaXplKCB2YWx1ZSApOyAgICAgICAgIC8vIOWfuuW6leOCr+ODqeOCueOBruWIneacn+WMlgogICAgCW1fVmFsdWVDXzEuSW5pdGlhbGl6ZSggdmFsdWUgKTsgLy8gMeeVquebruOBruODoeODs+ODkOWkieaVsOOBruWIneacn+WMlgogICAgfQogICAgaW50IEdldFZhbHVlQzEoIHZvaWQgKSBjb25zdCB7IHJldHVybiBtX1ZhbHVlQ18xLkdldFZhbHVlKCk7IH0KICAgIGludCBHZXRWYWx1ZUMyKCB2b2lkICkgY29uc3QgeyByZXR1cm4gbV9WYWx1ZUNfMi5HZXRWYWx1ZSgpOyB9Cn07CgppbnQgbWFpbiggdm9pZCApCnsKCS8vIOODh+ODleOCqeODq+ODiOOCs+ODs+OCueODiOODqeOCr+OCv+OBq+OCiOOCi+WIneacn+WMlgogICAgewoJCUMgYzsKICAgIAlwcmludGYoICIlZCwlZCwlZCwlZFxuIiwgYy5HZXRWYWx1ZUEoKSwgYy5HZXRWYWx1ZUIoKSwgYy5HZXRWYWx1ZUMxKCksIGMuR2V0VmFsdWVDMigpICk7CiAgICB9CiAgICAvLyDoh6rnlLHjgarliJ3mnJ/ljJYoSW5pdGlhbGl6ZemWouaVsCkKICAgIHsKCQlDIGMoIF9FbXB0eUNvbnN0cnVjdG9yICk7CiAgICAgICAgYy5Jbml0aWFsaXplKCA5ICk7CiAgICAJcHJpbnRmKCAiJWQsJWQsJWQsJWRcbiIsIGMuR2V0VmFsdWVBKCksIGMuR2V0VmFsdWVCKCksIGMuR2V0VmFsdWVDMSgpLCBjLkdldFZhbHVlQzIoKSApOwogICAgfQogICAgLy8g44G544Gk44Gu5byV5pWw44Gn44CCCiAgICB7CgkJQyBjKCBfRW1wdHlDb25zdHJ1Y3RvciApOwogICAgICAgIGMuSW5pdGlhbGl6ZSggMTExMSApOwogICAgCXByaW50ZiggIiVkLCVkLCVkLCVkXG4iLCBjLkdldFZhbHVlQSgpLCBjLkdldFZhbHVlQigpLCBjLkdldFZhbHVlQzEoKSwgYy5HZXRWYWx1ZUMyKCkgKTsKICAgIH0KICAgIHJldHVybiAwOwp9