周期的なサイクルを許す可能性がある同じタイプの他のクラスへのポインタのベクトルを持つクラスが欲しければ、どのように危険ですか?例えば、私はこのようになりますテキストファイルを持っていると言う:同じクラスタイプの設計の可能性のあるベクトルのベクトル
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;
}
}
}
}
私の心配はより多くの都市はどこか別の場所に移転、ベクトルはサイズ直しすることが、主な市ベクターに押し込まれ、そしてすべての私の都市は、ポインタをぶら下がっているsisterCitiesを指しているかどうということです。少なくとも、これは私の考えであるベクトルクラスの知識に基づいて行われます。世界のすべての都市と姉妹都市がリンクされたリストに格納されていれば、これは私の問題を解決するでしょうか?私は都市が建設されるとそれが動かないことを保証したいと思います(悪い馬小屋?)
これは私にとって厄介な問題のようです。デトロイトの姉妹都市を呼び出すように、私はそれを姉妹都市などと呼ぶことができます。それから私はデトロイトに戻ることができます!トピーカの名前がGoogleに変更された場合、トピーカの姉妹都市はすべて自動的に知る必要があります(トピーカが配置されている同じ場所を指しているため)。
アドバイスありがとうございます。
これは素晴らしいことですが、明確にするために、ベクトルのサイズが変更されても、 '&cities [0]'は常に同じメモリ位置を指していますか? –
申し訳ありませんが、私はあなたの質問を誤解しています。私はその問題に対処するために私の答えを編集しました。 –