Указатель на параметр в функции не работает
проблема в том что когда вызываю соответствующую функцию получаю ошибку об не инициализированной переменной t:
void addPassenger(BookTicket*t, vector<BookTicket>tickets){
string name;
string surname;
string typeWagon;
int numberWagon;
int numberTrain;
double price;
cout << "Enter name";
cin >> name;
cout << endl;
cout << "Enter surname";
cin >> surname;
cout << endl;
cout << "Enter type of wagon";
cin >> typeWagon;
cout << endl;
cout << "Enter number of wagon";
cin >> numberWagon;
cout << endl;
cout << "Enter number of train";
cin >> numberTrain;
cout << endl;
cout << "Enter price";
cin >> price;
cout << endl;
t=new BookTicket(name, surname, typeWagon, numberWagon, numberTrain, price);
tickets.push_back(*t);
}
int main(){
BookTicket *t;
vector<BookTicket>tickets;
BookTicket* t;
addPassenger(*t,tickets)
}
Ответы (1 шт):
Странно, если она у вас вообще компилируется - из-за объявления двух
BookTicket *t;
В таком объявлении нет инициализации, значение t не определено. Вы передаете его в функцию по значению - значит, функция получает мусор. Об этом компилятор и пытается предупредить.
Другое дело, что вашей функции этот параметр t не нужен - вы никак не используете его значение, используя его как обычную локальную переменную. С тем же успехом можно было бы написать функцию вида
void addPassenger(vector<BookTicket>tickets)
{
BookTicket*t;
string name;
...
Нетерпеливые, подождите ругаться, сейчас перейдем к главному.
А главное - что ваша функция не будет делать то, что вы от нее хотите. Потому что вы передаете в нее копию вектора tickets, так что вы добавляете новый элемент в копию, которая при выходе из функции уничтожается.
Поэтому на самом деле ваша функция должна иметь вид
void addPassenger(vector<BookTicket>& tickets)
{
BookTicket*t;
string name;
...
Но и это не все!
Вот тут
t=new BookTicket(name, surname, typeWagon, numberWagon, numberTrain, price);
tickets.push_back(*t);
вы создаете в динамической памяти экземпляр BookTicket, который передаете в push_back, где он копируется, а оригинал не уничтожаете. Получается утечка памяти. Лучше уж передавать сразу
tickets.push_back(BookTicket(name, surname, typeWagon, numberWagon, numberTrain, price));
и выбросить вашу переменную BookTicket*t; вообще!
Но еще лучше использовать функцию emplace_back, чтобы создавать объект прямо на месте, в векторе, без лишнего копирования:
tickets.emplace_back(BookTicket(name, surname, typeWagon, numberWagon, numberTrain, price));
Надеюсь, вы сможете теперь собрать все воедино?..