0

私が取り組んでいるグラフでは、データ ファイルから取り込まれた国があり、CCountry オブジェクトに格納されます。次に、それらは CContinent オブジェクトに格納され、CContinents のリストに格納されます。追加されたループ内の国に関する情報を調べると、正しい情報が得られます。ただし、後で国情報を調べると、すべての国が同じ国であると表示されます (最後に追加された国)。国リストを作成するコードと、関連するオブジェクト コードを次に示します。

while(line != "------")
{
    getline(filestr, line);
    CContinent *tempContinent = new CContinent(line);

    getline(filestr, line);
    while(line != "---" && line != "------")
    {
        CCountry *tempCountry = new CCountry(line);
        tempContinent->addCountry(*tempCountry);
        getline(filestr, line);
        //cout << tempCountry->getName() << flush;
    }
    world.push_back(tempContinent);
}



void CContinent::addCountry(CCountry country)
{
    (countries).push_back(&country);
}



CCountry::CCountry(string in_name)
{
name = in_name;
}

他に見たいコードがあればお尋ねください。

リクエストごとに、ここでリストに後でアクセスしようとします。

homeCountry = NULL;     

    size_t found;
    found = line.find_first_of(",");
    string homeCountryName = line.substr(0, found);
    for (list<CContinent*>::iterator it=world.begin(); it != world.end(); it++)
    {
        list<CCountry*> tempCont = (*it)->getCountries();
        //cout << it->getName() << " " << flush;
        for (list<CCountry*>::iterator it2=tempCont.begin(); it2 != tempCont.end(); it2++)
        {
            //cout << (*it2)->getName() << flush;
            //cout << homeCountryName << flush;
            if ((*it2)->getName() == homeCountryName)
            {
                *homeCountry = **it2;
            }
        }
    }

CContinent 宣言:

class CContinent
{
string name;
list<CCountry*> countries;
public:
CContinent(string in_name);
~CContinent();
void addCountry(CCountry country);
list<CCountry*> getCountries();
string getName();
};

新しいバグ:

これでプログラム全体が実行されるようになりましたが、これは素晴らしいことですが、メインにテスト出力を追加して、すべてのネイバーが正しく取得されているかどうかを確認しました。ここでの問題は、正しい数の隣人を取得していることですが、彼らの名前を尋ねると、最後から 2 番目の国とだけ表示されます。何か案は?

参考までに、コードはこちらです。

for (list<CContinent*>::iterator it = world.begin(); it != world.end(); it++)
{
    list<CCountry*> var1 = (*it)->getCountries();
    for (list<CCountry*>::iterator it2 = var1.begin(); it2 != var1.end(); it2++)
    {
        cout << "Country: " << (*it2)->getName() << endl;
        list<CCountry*> var2 = (*it2)->getNeighbors();
        cout << "Neighbors: ";
        for (list<CCountry*>::iterator it3 = var2.begin(); it3 != var2.end(); it3++)
        {
            cout << (*it3)->getName() << " ";
        }
        cout << endl;
    }
}   

新しいバグ:

そのため、プログラム全体で実行されるようになりました。これはプラスです。ただし、プログラムのメインで近隣国の名前を教えてくれるように頼むと、(一般的に) 正しい数の近隣国のリストが表示され、最後から 2 番目の国の名前がす​​べて表示されます。理由がわからない。これがコードです。

for (list<CContinent*>::iterator it = world.begin(); it != world.end(); it++)
{
    list<CCountry*> var1 = (*it)->getCountries();
    for (list<CCountry*>::iterator it2 = var1.begin(); it2 != var1.end(); it2++)
    {
        cout << "Country: " << (*it2)->getName() << endl;
        list<CCountry*> var2 = (*it2)->getNeighbors();
        cout << "Neighbors: ";
        for (list<CCountry*>::iterator it3 = var2.begin(); it3 != var2.end(); it3++)
        {
            cout << (*it3)->getName() << " ";
        }
        cout << endl;
    }
}   
4

2 に答える 2

3

あなたの問題は、ポインタと参照をどのように渡しているかにあります。あなたは を持っていListますCCountry*:

list<CCountry*> countries;

したがって、addCountry関数は次のようになります。

void CContinent::addCountry(CCountry* country)
{
    countries.push_back(country);
}
于 2013-01-02T21:02:22.250 に答える
0

新しいバグの更新: 大陸の addCountry と同様のバグでした。CCountry の addNeighbor 関数を addCountry のように変更したところ、機能しました。助けてくれてありがとう!

于 2013-01-02T22:05:14.257 に答える