这个会有点刺痛:\。这是我的地图声明:
std::map<std::string, std::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > > > m_EntityByClassList;
真的,它这么长的唯一原因是智能指针声明,几乎就是这样:
std::map<std::string, std::vector<BaseEntity *> *> m_EntityByClassList;
虽然读起来还是很痛苦。这是我的问题。当我尝试将对象插入地图中的新向量时,出现“试图读取访问冲突”运行时错误。
产生此错误的代码块是这样的,
for(;;)
{
file >> classname;
if(file.eof())
break;
m_EntityList.push_back( m_factory.createInstance(classname));
m_EntityList.back()->Initialize();
m_EntityList.back()->GetParams(file);
m_EntityByNameList[m_EntityList.back()->GetName()] = m_EntityList.back();
m_EntityByClassList[classname]->push_back(m_EntityList.back());
}
现在是的,肯定有很多代码我在这里省略了,主要是因为这里有 35 或 36 个对象和文件进入这个简介,所以我只想列出相关的东西。file 是std::ifstream
一个打开的文件, classname 是 an std::string
, m_EntityList 是 a std::vector<std::shared_ptr<BaseEntity> >
(不应该重要), m_EntityByNameList 是具有索引类型std::string
和对象类型std::shared_ptr<BaseEntity>
(也应该不重要)的映射,然后是上面的映射。最后一个上面的所有陈述都完全正确,结果经过验证。如果省略最后一行,它会编译并工作得很好。
所以这个问题与其余文件无关,只是关于尝试向地图添加矢量并向其添加对象。如果您觉得您还需要其他任何东西,请询问,我会考虑将其张贴在这里。发布所有内容很容易是 4000-4500 行。
Annnnyway,我从中学到的关于地图的知识是,使用带有尚未存在的索引的 [ ] 运算符将为您创建一个索引以及该索引处的默认构造对象。所以我从中得到的是,std::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > >
将在索引类名处创建一个,这意味着我应该能够访问该向量,无论它是事先创建的还是之前创建的。那么有人知道发生了什么吗?