2013-04-01 4 views
0

У меня есть программа, которая хранит наборы классов и структур в списках.C++ Указатель по ссылке, списки классов и указателей, wierd return

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

  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 

EDIT: Извините, я связал неправильную функцию отображения(). Отредактированный код для обновления

+0

Куда он обращается по ссылке? – 0x499602D2

+0

bool Inspection :: check (int input, T it, T2 l, P * & Ptr) В первом кодовом блоке, где Ptr вводится в функцию, и обратно обратно –

+0

И что такое 'p', который вы передали к вызову функции? – 0x499602D2

ответ

2

Не выдерживающие вопросы дизайна указали 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)  
+0

Thankyou! Это исправить, но я согласен, я обязательно вернусь и попытаюсь переписать его. Ваша помощь очень ценится :) –

+0

@RoryChatterton Очень рад, что это сработало. Образец того, что я имел в виду, можно найти [по этой ссылке] (http://ideone.com/NoZafi). Это может быть сделано значительно лучше, в том числе с использованием SFINAE, чтобы гарантировать, что базовый тип данных, которые повторяются, является Property или Property-производным, но, как я надеюсь, он дает о чем подумать. Опять же, рад, что вы заработали. (и +1 к ответу). – WhozCraig

Смежные вопросы