LocalArray
固定配列をメンバに持たせる場合、その領域を動的に確保して Length と一緒に管理するか、メンバ内に固定配列を用意することになるんだけど、今回は動的に確保するのはエラー処理がめんどいのでやらないことになりました。
で、当然、
class Hoge { ... }; class Moke { private: Hoge _hoge[10]; };
って書くことになるんだろうけど、この場合、配列の長さを取得したかったら、sizeof(a)/sizeof(a[0]) みたいなマクロを使ったり、マジックナンバーを #define しておいたりするんだろうけど、それはなんかかっこ悪い。
だからといって、配列の長さを取得するために Moke::HogeLength() みたいなのを実装するのも、Length は Hoge 自体が持っておくべき情報なので違うと思う。
ということで、
class HogeArray { public: const Hoge& operator[](int index) const{ return Get(index); } Hoge& operator[](int index){ return Get(index); } int Length() const{ return sizeof(_hoge) / sizeof(_hoge[0]); } private: Hoge& Get(int index) { _ASSERT(0 <= index && index < Length()); return _hoge[index]; } private: Hoge _hoge[10]; };
こんなクラスを作ってみたわけだけど、固定配列を入れるたびにこんなのやってられねぇと思い、テンプレートにしてみました。
template<class T, int Num> class LocalArray { public: const T& operator[](int index) const{ return Get(index); } T& operator[](int index){ return Get(index); } int Length() const{ return Num; } private: T& Get(int index) { _ASSERT(0 <= index && index < Length()); return _obj[index]; } private: T _obj[Num]; };
class Moke { private: LocalArray<Hoge, 10> _hoge; };
本格的に使うには機能が足りなさすぎるけど、ちょっとしたことには使えるんでない?みたいな。