Указатель C ++ по ссылке, списки классов и указатели, странный возврат

У меня есть программа, которая хранит наборы классов и структур в списках.

Это делает следующее:

  1. Проходит ввод int), итератор, список и указатель по ссылке в функцию check()
  2. Перебирает список, пока не найдет совпадение между данными итератора и входными данными.
  3. Устанавливает указатель в качестве позиции итератора
  4. Возвращает true или false, в зависимости от того, было найдено совпадение или нет.

Моя проблема в том, когда я вызываю функцию 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

РЕДАКТИРОВАТЬ: Извините, я связал неправильную функцию дисплея (). Отредактированный код для обновления

0

Решение

Несмотря на проблемы проектирования, указанные в 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)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]