У меня есть карта контейнер для хранения определенных объектов, вместе со своим именем и типом:Получение поля из STL карты итератора
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" не очень ясны, и неосновательный. Если он изменен в будущем, для поддержки еще одного поля, например, все будет разбито. Итак, я пытаюсь изменить их функции, чтобы получить доступ к полям, как это:
ObjBase*& getObjPtr(ObjContainer::iterator it) {
return it->second.second;
}
Аналогично, также функционируют getObjName и getObjType.
Было также предложено мне, что было бы более понятно, чтобы итератор возвращающегося эти поля:
it.objPtr();
it.objName();
it.objType();
Но я думаю, что STL итераторы не должны быть унаследованы, чтобы эти функции, не так ли? Я не вижу другого способа сделать это, кроме как создать оболочку для карты и иметь свой собственный итератор с этими функциями.
Итак, что было бы наиболее подходящим вариантом? Есть ли другой способ решить эту проблему, которую я не вижу?
Почему вы не просто использовать на структуру вместо пары и назовите свои поля так, как вы хотите? – Spidey
@Spidey: зачем откатывать собственные определения классов, если библиотека уже поставляется с совершенно исправным? –
Вы можете обернуть аттракторами.По крайней мере, вам удастся избежать использования пары. Первый, пара.секунд, пара-> второй-> второй и т. Д. – Spidey