【发布时间】:2012-04-03 22:01:18
【问题描述】:
我有一个地图容器来存储某些对象,以及它们的名称和类型:
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:如果库已经提供了一个完全可用的类定义,为什么还要推出自己的类定义?
-
你可以用 acessors 包装它们。至少你会侥幸不使用pair.first、pair.second、pair->second->second等。