Указатель на параметр в функции не работает

проблема в том что когда вызываю соответствующую функцию получаю ошибку об не инициализированной переменной 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 шт):

Автор решения: Harry

Странно, если она у вас вообще компилируется - из-за объявления двух

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

Надеюсь, вы сможете теперь собрать все воедино?..

→ Ссылка