GPUPPURUTのコンストラクタが

例えば、


class Hoge
{
public:
Hoge(int foo);
Hoge(double bar);

protected:

init();

Hage hage;
Hige hige;
Huge huge;
};

Hoge::Hoge(int foo):
hage(),
hige(false),
huge(NULL)
{
::hogefunc(foo);
}

Hoge::Hoge(double bar):
hage(),
hige(false),
huge(NULL)
{
::hogefunc(bar);
}

というコンストラクタが二つあるクラスがあったとします。
二つのコンストラクタのメンバ初期化子リストが同じなので、これを一つにまとめたいとしましょう。


class Hoge
{
public:
Hoge(int foo);
Hoge(double bar);

protected:

init();

Hage hage;
Hige hige;
Huge huge;
};

hoge::init()
{
Hage = hage();
hige = hige(false);
huge = huge(NULL);
}

Hoge::Hoge(int foo):
{
this->init();
::hogefunc(foo);
}

Hoge::Hoge(double bar):
{
this->init();
::hogefunc(bar);
}

一応メンバ変数の初期化はまとめることができていますが、一度コンストラクタでメンバ変数が初期化され、init()関数で代入が行われています。ですので、無駄な処理が少し多くなってます。また、Hige型やHuge型のオブジェクトを引数無しのコンストラクタで初期化できない場合、コンパイルエラーとなります。
そこで、以下のようにしてみます。


class Hoge
{
public:
Hoge(int foo);
Hoge(double bar);

protected:
class State
{
State():
hage(),
hige(false),
huge(NULL)
{
}

Hage hage;
Hige hige;
Huge huge;
};

State state;
};

Hoge::Hoge(int foo):
state()
{
::hogefunc(foo);
}

Hoge::Hoge(double bar):
state()
{
::hogefunc(bar);
}

これでメンバ変数はちゃんとパラメータ付で初期化されます。ですが、これだとメンバ変数にアクセスするときに
this->state.hage;
というふうにstateオブジェクトを通して間接的にアクセスするようになってしまいます。

GPUPPURUTで上記のような問題が発生したのですが、結局最後のやり方を採用しました。


それと、Visual C++ 2005で開発してたのですが、GPUPPURUTを他のコンパイラでもコンパイルできるように言語拡張をオフにしたら、windows.hとかでエラーが出てくるようになりました。stdafx.cppだけ言語拡張を許すようにしても、警告がでるので結局言語拡張をオンにすることにしました。ちゃんとg++で-std=c++98オプション付けてコンパイルできれば大丈夫でしょう。