2017-02-02 5 views
0

У меня есть массив указателей, которые должны удерживать расположение памяти других объектов. Добавление массивов в список2 и печать значения из этого объекта дает мне правильное значение. Но попытка попытаться распечатать его из другой функции даст мне случайные значения.C++ Указатели переустановки, назначенные пошаговой ссылке, дающие случайные значения

Классы:

class Airline() { 
Airline(); 
Flight *list2[20]; //array of pointers to Flight 
}; 

class Flight() { 
int flightNo; 
int MaxPeople; 
}; 

Добавить функцию Flight:

currentPos1 =-1  //Global Variable 

void Airline::addFlight(Flight flight) { 
currentPos1++; 
list2[currentPos1] = &flight; 
cout <<(*list2[currentPos1]).flightNo <<"\n"; //Gives proper Value 
} 

ShowAllFlights функции:

void AirDB::showAllFlights() { 
    for (int i = 0; i <= currentPos1; i++) 
    { 
    //Both cout's provide random values; 
     cout <<"\nFlight Number: " <<list2[i]->flightNo; 
     cout <<"\nMaxPeople: " << list2[i]->maxPeople; 
    } 
} 

ли мой реферирование и де-ссылки здесь не так? Любая помощь будет очень оценена.

+1

Комментарий '// массив указателей на указатели' должен читать' массив указателей на Flight'. Полет не является указателем. –

ответ

3

Один вопрос здесь:

list2[currentPos1] = &flight;

Это не будет работать, так как вы присваиваете указатель на временный Flight. Когда возвращается функция addFlight, этот указатель уже недействителен.

То, что вы хотите сделать, это пройти по ссылке Flight (предпочтительно const ссылка):

void Airline::addFlight(const Flight& flight) 

Обратите внимание, что это основывается на жизни аргумента, передаваемого addFlight. Для этой конкретной функции flight будет действителен, но после вызова функции аргумент, который вы отправляете, также должен быть действительным в течение времени жизни, которое вы намереваетесь использовать, указав, что вы сохранили в list2.

Вместо массива указателей на Flight, используя std::vector<Flight>, было бы более легким решением.

+0

Это, вероятно, не решит проблему, так как вызывающий аргумент, вероятно, закончит свою жизнь вскоре после –

+0

Thankyou. Это именно то, чего мне не хватало. – Mish