前方宣言

今のプロジェクトではC++にあんまり慣れてなくてCスタイルでコーディングする人が多い。
前の会社のメインの人もそうだったんだけど、

typedef struct
{
  int var;
}hoge_t;

みたいに構造体の宣言にtypedef使うのは気になってしょうがない。
Cだと上記の様にしないと使う時にいちいち

struct hoge_t 変数名;

とかやらなきゃいけなくなるから、typedefするのが普通なんだけど、
C++では

sturct hoge_t
{
  int var;
};

と宣言してもなんら問題は無く、hoge_tの宣言の時も普通に

hoge_t 変数名;

として使うことができるので構造体の宣言にわざわざtypedefする必要は全く無い。


さらに前方宣言することでvoidポインタにする事無く、ヘッダのインクルード地獄からの脱出できるのだけど、構造体がtypedefで宣言されていると前方宣言することが出来ないのだ。


なのでC++しか開発しない事が分かっているプロジェクトならば、クラスと同じ方法で構造体を宣言することで前方宣言を可能にして、ヘッダのインクルード地獄から開放されよう!という基本的なお話。


ちなみにクラスの前方宣言を知らない人って結構いるので簡単に説明すると、


C++ではclass Aのヘッダでclass Bのポインタか参照しか使わないときに以下のような方法でclass Bのヘッダをインクルードせずに宣言することができる。(Cでもできるのかな。)

// A.h
class B;
class A
{
  B *pB;

  A(B &rB);  // Bの参照だけならOK
};


とすることでBのポインタ、参照の宣言が可能になる。超便利!


しかし、Bのメンバにアクセスする場合はclass Bの構造をコンパイラが知らなければいけないのでclass Bのヘッダをインクルードする必要があるので注意。


例えばtemplateでBのメンバをヘッダで扱う必要がある場合はヘッダにインクルードしなければならないのでtemplateクラスの設計は慎重に行わなければいけないだろう。


とか偉そうに色々書いてみた。
前方宣言てあんまりC++の基本的な参考書に書いてないんですよね。
自分が知ったのも前の会社の超絶プログラマーのコードを変更しなければならない時があってそん時に知ったぐらいですから。


でも最近はpimplとか言う手法がメジャーになってきているらしいので、今からプログラム始めるような人では逆に常識になってるのかも知れない。
ので恥の上塗りはここら辺にしておきます。