改变对象

时间:2013-01-02 20:53:30

标签: c++

在我正在研究的图表中,我将国家从数据文件中取出并存储到CCountry对象中,然后将这些对象存储在CContinent对象中,这些对象存储在名为world的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();
};

新BUG:

所以它现在贯穿整个程序,这很不错,但我在main中添加了一个测试输出,看看它是否让所有邻居都正确。现在的问题是它正在获得正确数量的邻居,但当被问到他们的名字是什么时,它只是说倒数第二个国家。有什么想法吗?

供参考,这是代码。

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

新BUG:

所以现在它贯穿整个程序,这是一个加号。但是,当我要求它向我提供该计划主要部分中邻国的名称时,它会给我一份(通常)正确数量的邻国名单,其中包含倒数第二个国家的所有名称。不知道为什么。这是代码。

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 个答案:

答案 0 :(得分:3)

你的问题在于如何传递指针和引用。您有List CCountry*

list<CCountry*> countries;

因此,您的addCountry函数应该更像:

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

答案 1 :(得分:0)

NEW BUG UPDATE:这是与各大洲的addCountry类似的错误。我改变了CCountry中的addNeighbor函数看起来像addCountry,它工作正常。谢谢你的帮助!