配列要素のアクセサメソッド
nytrソースコード中でばらばらなので、そろそろ統一しないとまずい。
未だにどうすればいいのかわからない。
1. std::vector& std::list& 等内部実装への参照を返す
1'. 上と同様だが内部構造をtypedefしておく。
内部構造を変えても修正不要。
2. getnObj(), getpObj(unsigned int nIdx)
C配列でも対応可。コンテナによっては非常にパフォーマンスが悪い。(双方向リストで実装されているstd::list等)
こうして並べてみると普通に1'でいい気がしてきた。C配列使いたいときはboost::arrayがあるしね。
ただ、あくまで読み込みのみにして、追加は別メソッドを提供する方針でいったほうがよさそう。要素追加時にアサーテーションを入れたり、キャッシュ更新等をいれるのが良くあるため。
要素数を動的に決定できるboost::arrayというのはないんだろうか?std::vectorを使えばいい話だが、Allocatorの挙動がブラックボックスなので、ちょっと微妙。boost::scoped_arrayは、設計思想上iteratorは提供していない。
std::vectorのコンストラクタ直後にreserve()を呼ぶのも変な書き方になってしまうし、その後固定要素数分push_backで初期化するのも違和感がある。(コンストラクタに要素数指定すると全ての要素に対してDefault C-torが呼ばれてしまう)
これは、自前コーディングルールが原因なのかもしれない。C-tor⇒init()という形をとらず、特別なクラス以外はC-torが呼ばれた時点で全てのメソッド呼び出しを保証する設計になっている。(失敗が起こりうる場合はC-tor methodで例外を投げる or NULLを返すことで解決している)ここで軽いC-torを作り、コピーコンストラクタを許容することで解決可能かもしれない。
ただ、このような「一部未初期化オブジェクト」を許容しないことでバグの入り込む余地をかなり狭めることができていると思うので、できればこれは変えないでおきたい。
アクセス数がすくなかったり、継承をしていたりすると、問答無用でboost::ptr_vectorに放り込めばいいのだが、軽くアクセス数が多いオブジェクトをptr_vectorで管理しようとすると、二重参照のオーバーヘッドが気になってくる。
となると、やはり解決策は自前コンテナぽい。boost::iteratorsを使えば簡単にiterator実装はできそうだし、templateの練習にもいいかもしれない。
さてさて、勉強しないと。