2013-04-01 51 views
0

我有一个程序,它存储在列表中的类和结构集。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

它在哪里通过引用传出? – 0x499602D2

+0

bool Inspection :: check(int input,T it,T2 l,P *&Ptr) 在第一个代码块中,Where 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

谢谢!这确实解决了它,但我同意,我一定会回去尝试重写它。您的帮助非常感谢:) –

+0

@RoryChatterton非常高兴它的工作。我可以在[链接]找到我所指的样本(http://ideone.com/NoZafi)。它可以做得更好,包括使用SFINAE来确保被迭代的数据的基本类型是一个属性或属性派生物,但我希望它提供了一些想法。再一次,很高兴你正在运行。 (和答案+1)。 – WhozCraig