循環サイクルを可能にする、同じ型の他のクラスへのポインタのベクトルを持つクラスが必要な場合、それはどのくらい危険ですか? たとえば、次のようなテキスト ファイルがあるとします。
city=Detroit
{
sister=Toyota
sister=Dubai
...
}
...
最初に、ファイルは一連の一時クラス ParsedCity に読み込まれ、都市の名前と姉妹都市の名前が保持されます。ファイルにすべての都市を配置したら、実際の City クラスを作成します。
class City
{
private:
std::string name;
std::vector<City*> sisterCities;
public:
City(const std::string& aName);
CreateRelations(const ParsedCity& pcs);
std::string Name() const { return name; }
};
//If this were to represent Detroit, pc would contain a vector of strings
//containing Toyota and Dubai. Cities contain the actual classes that sister
//cities should point to. It holds all cities of the world.
City::CreateRelations(const ParsedCity& pc, std::vector<City>& cities)
{
for (unsigned int i = 0; i < pc.ParsedSisterCities().size(); i++)
{
for (unsigned int j = 0; j < cities.size(); j++)
{
if (pc.ParsedSisterCities()[i] == cities[j].Name())
{
sisterCities.push_back(&cities[j]);
break;
}
}
}
}
私の懸念は、より多くの都市がメインの City ベクトルにプッシュされた場合、ベクトルのサイズが変更され、別の場所に移動し、すべての都市がダングリング ポインターである姉妹都市を指すようになることです。少なくともこれは、ベクトル クラスに関する私の知識に基づいて起こるだろう私の考えです。世界のすべての都市と姉妹都市がリンクされたリストに保存されている場合、これで問題は解決しますか? 都市が建設されると、それが動かないという保証が欲しいです(記憶にある.悪いしゃれ?)
これは私にはトリッキーな問題のように思えます。私がデトロイトの姉妹都市を呼ぶかのように、私はそれを姉妹都市と呼ぶことができます. そして、私はデトロイトに戻ることができました! Topeka がその名前を Google に変更した場合、Topeka のすべての姉妹都市は自動的に認識されるはずです (これらの都市はすべて、Topeka があるメモリ内の同じ場所を指しているため)。
どんなアドバイスでも大歓迎です!