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;
            }
        }
    }
}

私の懸念は、より多くの都市がメインの City ベクトルにプッシュされた場合、ベクトルのサイズが変更され、別の場所に移動し、すべての都市がダングリング ポインターである姉妹都市を指すようになることです。少なくともこれは、ベクトル クラスに関する私の知識に基づいて起こるだろう私の考えです。世界のすべての都市と姉妹都市がリンクされたリストに保存されている場合、これで問題は解決しますか? 都市が建設されると、それが動かないという保証が欲しいです(記憶にある.悪いしゃれ?)

これは私にはトリッキーな問題のように思えます。私がデトロイトの姉妹都市を呼ぶかのように、私はそれを姉妹都市と呼ぶことができます. そして、私はデトロイトに戻ることができました! Topeka がその名前を Google に変更した場合、Topeka のすべての姉妹都市は自動的に認識されるはずです (これらの都市はすべて、Topeka があるメモリ内の同じ場所を指しているため)。

どんなアドバイスでも大歓迎です!

4

2 に答える 2

2

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

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

編集:

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

于 2012-04-26T14:53:29.597 に答える
0

これは私にはトリッキーな問題のように思えます。私がデトロイトの姉妹都市を呼ぶかのように、私はそれを姉妹都市と呼ぶことができます. そして、私はデトロイトに戻ることができました!

それが「循環参照」です。deletedオブジェクトは手動であるため、これは C++ では必ずしも問題ではありません。ただし、お気づきのように、設計が複雑になる可能性があります。

于 2012-04-26T14:54:32.290 に答える