i'm writing c++ program reads in list of passengers , creates passenger objects stored in dynamically allocated pointer. however, noticed when ran program, adding new passenger cause of set passengers assigned new passenger too.
the problematic segment of code below:
int x = 400; passengerslot = 0; passenger * list = new passenger[x]; ifstream myfile("airline.csv"); if (myfile.is_open()) { while (getline(myfile, line)) { std::istringstream ss(line); std::string token; int dataslot = 0; while (std::getline(ss, token, ',')) { switch (dataslot){ case 0: *last = token; break; case 1: *first = token; break; case 2: *rownum = atoi(token.c_str()); break; case 3: *seat = token.at(0); break; case 4: *flightnum = atoi(token.c_str()); list[passengerslot] = *new passenger(last, first, rownum, flightnum, seat); cout << list[passengerslot].getpassenger() << endl; //prints passengers assigned if (passengerslot != 0){ cout << list[passengerslot - 1].getpassenger() << endl; } my passenger constructor:
passenger::passenger(string *fname, string *lname, int *rownum, int *flightnum, char *seatchar):firstname(fname), lastname(lname), rownumber(rownum), flightnumber(flightnum), seat(seatchar){ *firstname = *fname; *lastname = *lname; *rownumber = *rownum; *flightnumber = *flightnum; *seat = *seatchar; }
the unusual dereferencing of pretty has me worried may reusing same pointers on , over, writing on same memory locations every time, assigning memory locations pointers inside passenger.
for example, constructor:
passenger::passenger(string *fname, string *lname, int *rownum, int *flightnum, char *seatchar):firstname(fname), lastname(lname), rownumber(rownum), flightnumber(flightnum), seat(seatchar) { *firstname = *fname; *lastname = *lname; *rownumber = *rownum; *flightnumber = *flightnum; *seat = *seatchar; } firstname(fname) means has pointer string, if program compiles, firstname being assigned address pointed fname. same pattern follows other members , associated parameter.
*firstname = *fname; nothing. copies string @ fname on top of string @ firstname, because of assignment in previous point exact same place.
this means of passenger::firstnames point fname, passenger::lastnames point lname, etc... end result passengers same recent passenger.
solution: stop using pointers everything. don't need pointers.
the accumulation variables should be:
std::string first; std::string last; int rownum; int flightnum; char seat; passenger should be:
class passenger { public: passenger(const std::string & fname, const std::string & lname, int rownum, int flightnum, char seatchar); // other unspecified public methods private: std::string firstname; std::string lastname; int rownumber; int flightnumber; char seat; // other unspecified private data , methods } and constructor
passenger::passenger(const std::string & fname, const std::string & lname, int rownum, int flightnum, char seatchar): firstname(fname), lastname(lname), rownumber(rownum), flightnumber(flightnum), seat(seatchar) { } storage definition of
passenger * list = new passenger[x]; should more along lines of
std::vector<passenger> list; std::vector dynamically sizing array of memory management required use cases built right in.
and rather loading list with
list[passengerslot] = *new passenger(last, first, rownum, flightnum, seat); use
list.emplace_back(first, last, rownum, flightnum, seat);
Comments
Post a Comment