0

因为这是我第一次尝试使用向量指针,所以我对它进行了一些研究并在我的程序上进行了尝试,但是它并没有给我想要的结果,尽管它已经关闭了。如果我问一个问题,请原谅我糟糕的问题。

4

2 回答 2

3

您的错误是在打印向量的内容时,而不是在向其中添加数据时。

for (int i= 0; i<5; i++) {
    if(storeData.empty()) {
        cout <<"<no other records available>" << endl;
    }
    // error: storeData[i] may not be valid
    else if(storeData[i].getCivIndex() == 0 && storeData[i].getXOrdinate() == 0 && storeData[i].getYOrdinate() == 0) {
        cout << "<no other records available>" << endl;
    }
    else { 

        cout << "Civ Index:"<< storeData[i].getCivIndex() << ",at Sector("<< storeData[i].getXOrdinate() << "," << storeData[i].getYOrdinate() <<")" << endl;

    }
}

即使向量包含更少,您也总是希望在此处读取 5 条记录。您应该在取消引用之前检查向量的大小,否则您正在读取随机内存并且会导致未定义的行为。

    if(storeData.size() <= i) {
        cout <<"<no other records available>" << endl;
    }
于 2013-10-13T04:29:53.127 回答
1
if(storeData.size() > 5) {
    storeData.resize(5);
}

首先,我认为您的意思是if(storeData.size()<5),否则以下打印肯定会失败,因为您只能storeData[0]在尝试访问其他人时才能访问。

当您resize没有第二个参数时,添加到向量中的项目将被默认构造。如果该PointTwoD结构不提供默认构造函数,则不会初始化其数据成员,这意味着它可能以随机值结束。这就是为什么你有那些奇怪的数字。(0 也是可能的)。

解决方案是在初始化列表中定义一个默认构造函数pointTwoD并将其数据成员设置为 0 或使用第二个参数调用resize

于 2013-10-13T04:38:14.443 回答