好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

コンストラクタでの初期化子を書くのをめんどくさがってるだけなんです

僕はコンストラクタが完了した時点で、

そのインスタンスはオブジェクトとして扱える状態になっていて欲しい派、

なので、initializeを持たなかったりします。

また、initializeにすると引数が多くなりすぎて面倒なので基本的にinitializeをつくりません。

コンストラクタが呼ばれた時点で初期化が終了してないとイヤだってじっちゃが言ってた - 神様なんて信じない僕らのために

やっぱりプログラマはコードを書かないと意思を通じ合えない人種なんだと実感したのであった。べ、別に普段から説明ベタなわけじゃないんだからね!

initialize は、メンバのポインタ変数をはじめとする、その他の変数を初期化する引数なしの関数‥‥と受け取った上での (゚∀゚)人(゚∀゚)ナカーマ 発言でした。この受け取り方であってたのかはとりあえず気にしないことにして、コード書きますよっと。

初期化まわりは、もっといい方法があったら教えていただきたいと思う所存であります。

class Hoge
{
public:
  Hoge();
  Hoge(const Hoge& o);
  Hoge(int flags);

private:
  A* pA;
  B* pB;
};

こういうクラスがあったとしたら

Hoge()
  : pA(NULL), pB(NULL)
{}

Hoge(int flags)
  : pA(NULL), pB(NULL)
{
  // なんか特殊な初期化
}

みたいに、コンストラクタごとに初期化子書くのがめんどいので、

void Hoge::initialize()
{
  pA = NULL;
  pB = NULL;
}

Hoge::Hoge()
{
  initialize();
}

Hoge::Hoge(int flags)
{
  initialize();
  // なんか特殊な初期化
}

とかにして、初期化コードの重複を無くそう、とかそんな感じです。親クラスのコンストラクタだけは初期化子使う。

初期化子の利点ガン無視? 不要な代入が増える? そんなの関係ねぇ! Don't repeat yourself!! (都合のいい解釈しかしてないw)

以前、ついカッとなって書いた、めちゃくちゃなマクロ*1を初期化子つかうように書き換えれば‥‥こんな気持ち悪いマクロ、毎回使いたくないけど。

個人的な結論としては、「C++0x が本格的に使えるようになったら解決するっぽいから、それまでは今の方法でお茶を濁しとこう」だったりする。テキトーなプログラマでスマン!!