これは少し刺すつもりです:\。これは私のマップ宣言です:
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はstd::string
、m_EntityListは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> > >
、インデックスクラス名で作成されるということです。これは、ベクターが事前に作成されたか、直前に作成されたかに関係なく、ベクターにアクセスできる必要があることを意味します。それで、誰かが何が起こっているのか手がかりを持っていますか?