2012-04-26 15 views
2

周期的なサイクルを許す可能性がある同じタイプの他のクラスへのポインタのベクトルを持つクラスが欲しければ、どのように危険ですか?例えば、私はこのようになりますテキストファイルを持っていると言う:同じクラスタイプの設計の可能性のあるベクトルのベクトル

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に変更された場合、トピーカの姉妹都市はすべて自動的に知る必要があります(トピーカが配置されている同じ場所を指しているため)。

アドバイスありがとうございます。

答えて

2

ポインターのベクトルがあり、ベクトルのサイズが変更された場合、メモリ内のポインターの位置は影響を受けないため、すべてのポインターは有効なままです。

このソリューションの最大の問題は、データ構造に適用する再帰アルゴリズムがサイクルを検出するメカニズムを持たなければならないことです。そうしないと無限再帰によってスタックオーバーフローが発生します。

編集:

私はちょうど私が最初にあなたの質問を読み違えることに気づきました。 citiesベクトルのサイズが変更されると、その要素へのポインタは無効になります。最善の選択肢は、そのベクトルの都市へのストアポインタです。これをより管理しやすくするために、boost::ptr_vectorを使用することをお勧めします。これは、ベクタから都市を削除したり、ベクタ内の都市を並べ替える場合(たとえば、高速検索のために名前を並べ替える場合など)にも、都市へのポインタが有効であるという利点があります。

+0

これは素晴らしいことですが、明確にするために、ベクトルのサイズが変更されても、 '&cities [0]'は常に同じメモリ位置を指していますか? –

+0

申し訳ありませんが、私はあなたの質問を誤解しています。私はその問題に対処するために私の答えを編集しました。 –

0

これは私にとっては厄介な問題のようです。まるで私が姉妹都市である デトロイトに電話するかのように、私はそれを姉妹都市と呼びます。 デトロイトで終わることができます!

これは「循環参照」です。オブジェクトはdeletedであるため、これはC++では必ずしも問題ではありません。しかし、それはあなたが見ているように、あなたのデザインに複雑さをもたらすかもしれません。

関連する問題