Почему мой код не добавляет каждый объект в вектор? - PullRequest
1 голос
/ 08 апреля 2019

Я читаю из файла и с полученной информацией хочу проанализировать данные и сохранить их в своих уважаемых объектах, которые затем будут перенесены обратно в вектор. Однако, когда код сохраняет информацию в объекте, а затем помещается обратно в вектор, вектор не содержит это значение. Затем он пропускает несколько мест в векторе и начинает правильно добавлять объекты в конец файла. Есть ли способ убедиться, что все элементы будут заполнены?

Вот мои структуры:

struct Address{ 
        string streetAddress; 
        string city; 
        string state; 
        string zipCode; 
};

struct Customer { 
        string customerNum; 
        string customerName; 
        double lineOfCredit; 
        Address * corperateAddress; 
};

Как видите, член Customer является указателем, который указывает на структуру Address.

Вот функция и некоторые переменные, используемые для кода ниже:

void readData(vector<Customer>&addCust, vector<Address>&cAdd, vector<Product>&pAdd){

Address street;
Customer add;
Product product;

vector<string> custInfo;
vector<string> custAddress;
vector<string> custProduct;
ifstream file,stock;

Здесь возникает ошибка. Я полагаю, что это в операторе if-else:

        custAddress=parse(location,',');                   //Parse the location to go into Address struct
        check = linearSearchAddress(cAdd,custAddress[0]);  //Checks Address vector to see if there is the same location

        street.streetAddress=custAddress[0];               //Adds 1st parse to the Struct member 
        street.city=custAddress[1];                        //Adds 2nd parse to the Struct member 
        street.state=custAddress[2];                       //Adds 3rd parse to the Struct member 
        street.zipCode=custAddress[3];                     //Adds 4th parse to the Struct member

        if(check==-1){                                     //If address is not found then add it to the Address vector 
            cAdd.push_back(street);                        //Adding objects into the Address vector
            add.corperateAddress = &cAdd.back();
        } else {
            add.corperateAddress=&cAdd[check];             //Adds location that is within vector already 
        }
         addCust.push_back(add);                           //Adding objects into Customer vector
     }
        cout<<addCust[0].corperateAddress->streetAddress<<endl;  // Element is empty some how ?

1 Ответ

3 голосов
/ 08 апреля 2019

Когда вы вызываете push_back для vector, если это вызывает увеличение размера вектора, оно делает недействительными все указатели и ссылки на вектор.vector сохраняет все объекты в одном непрерывном блоке памяти, поэтому при увеличении его размера может потребоваться выделить новый блок памяти, в результате чего все существующие объекты в векторе будут перемещены в это новое местоположение.

Ваш шаблон хранения указателей на объекты в vector не очень хороший, хотя вы можете заставить его работать, зарезервировав достаточное пространство в vector с самого начала - если вы знаете, насколько большим он будет.В противном случае вы можете использовать коллекцию, отличную от vector, у которой нет этого свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...