からフィールドを取得:は、私は一緒に自分の名前とタイプして、特定のオブジェクトを格納するためのマップ・コンテナを持つSTLのmapのイテレータ
typedef std::map<std::string, std::pair<ObjType, ObjBase*> > ObjContainer;
しかし、コードの多くの部分で、このような構造があります。
ObjContainer::iterator it = mObjContainer.find(name);
if (it != mObjContainer.end()) {
if (it->second.second) {
it->second.second->setObj2Default();
delete it->second.second;
it->second.second = 0;
}
}
明らかに、多くの "it-> second.second"はあまり明確ではなく、維持不能です。 将来変更された場合、たとえば、もう1つのフィールドをサポートするために、すべてが破損します。 だから、私はこのように、フィールドにアクセスするための関数でそれらを変更しようとしています:
ObjBase*& getObjPtr(ObjContainer::iterator it) {
return it->second.second;
}
は同様に、getObjNameとgetObjType機能します。
また、これらのフィールドを返すイテレータを持つことがより明確になることを私に示唆された。
it.objPtr();
it.objName();
it.objType();
しかし、私はSTLのイテレータは右、これらの機能を持つように継承されるべきではないと思いますか?マップのラッパーを作成し、それらの関数で独自のイテレーターを作成する以外は、他の方法はありません。
だから、最も適切な選択肢は何ですか?私が見ていないこの問題を解決する他の方法はありますか?
は、なぜあなたは単に構造体を使用していないし、コード内
second.second
これ以上ありませんペアの代わりにあなたのフィールドにあなたが望むように名前を付けますか? – Spidey
@ Spidey:ライブラリに完全にサービス可能なクラスが付属している場合、なぜ独自のクラス定義をロールバックするのですか? –
あなたはacessorsとwrap'emすることができます。少なくともpair.first、pair.second、pair-> second-> secondなどを使用しないで離れることになります。 – Spidey