У меня есть программа, которая хранит наборы классов и структур в списках.
Это делает следующее:
int
), итератор, список и указатель по ссылке в функцию check()
Моя проблема в том, когда я вызываю функцию display()
изнутри проверка функции, будь то из it->display()
, или же Ptr->display()
работает нормально. Но когда он передается обратно по ссылке, и я пытаюсь отобразить его. Это печатает мусор.
//it is the iterator, l is the list, Ptr is the passed pointer
template<class T, class T2, class P>
bool Inspection::check(int input, T it, T2 l, P * &Ptr)
{
for(it = l.begin(); it != l.end(); ++it){ //Iterates through list using iterator
if (it->checkExists(input)){ //if input == iterator class's data
Ptr = &*it;
//Display data - ERROR CHECKING//
it->display();
Ptr->display();
return true;
}
}
return false;
}
checkExists
это функция, которая сравнивает с частными данными в классе, который она итерирует, например,
bool Property::checkExists(int input)
{
if (input == ID)
return true;
return false;
}
display
также просто
void Property::display()
{
//Prints out property info
cout << ID << ";" << address << ";" << landTypes[type] << ";" << price << endl;
}
Стандартный звонок (p
это список Property
классы, которые я назвал ранее в программе)
int input;
Property * temp; //Pointer to a class temp
list<Property>::iterator pIT;
cin >> input;while(!check(input, pIT, p, temp)){
...
}
temp->display();
Типичный результат будет (первые два вызова в функции и правильно, третий является temp->display();
вызов извне функции.
1001;5/10 Northfields Ave, North Wollongong, NSW 2500;Townhouse;280000
1001;5/10 Northfields Ave, North Wollongong, NSW 2500;Townhouse;280000
13;�������\314���@�ve, North Wollongong, NSW 2500;Townhouse;280000
РЕДАКТИРОВАТЬ: Извините, я связал неправильную функцию дисплея (). Отредактированный код для обновления
Несмотря на проблемы проектирования, указанные в WhozCraig, проблема с выводом мусора из предоставленного вами кода выглядит следующим образом:
template<class T, class T2, class P>
bool Inspection::check(int input, T it, T2 l, P * &Ptr)
^^^^
Вы проходите l
по значению, а не по ссылке, поэтому вы получаете указатель на временную переменную, которая не будет существовать, если вы разыменуете ее вне метода. Если вы измените код следующим образом, он должен начать работать для этой конкретной проблемы, хотя он действительно нуждается в редизайне:
template<class T, class T2, class P>
bool Inspection::check(int input, T it, T2 &l, P * &Ptr)
Других решений пока нет …