【问题标题】:C++ Pointer by Reference, lists of classes and Pointers, wierd returnC++ 引用指针,类和指针列表,奇怪的返回
【发布时间】:2013-04-01 01:41:00
【问题描述】:

我有一个程序,它将类和结构集存储在列表中。

它执行以下操作:

  1. 通过引用将输入(int)、迭代器、列表和指针传递给函数check()
  2. 迭代列表,直到找到迭代器的数据和输入之间的匹配项
  3. 将指针设置为迭代器的位置
  4. 返回真或假,取决于是否找到匹配项。

我的问题是,当我从函数检查中调用函数 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-&gt;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

编辑:对不起,我链接了错误的显示函数()。编辑代码更新

【问题讨论】:

  • 通过引用传递到哪里?
  • bool Inspection::check(int input, T it, T2 l, P * &Ptr) 在第一个代码块中,Ptr 被推入函数的位置,然后再次退出
  • 你传递给函数调用的p是什么?
  • p 是 pIT 正在迭代的类的列表
  • 传递列表的整个前提和您随后仅用作局部变量的按值未初始化的迭代器需要完全重做。忘记传递列表。通过-val 传递两个迭代器(开始和结束),并可能使用iterator_traits&lt;It&gt; 来获取底层数据类型的属性,用作返回类型。换句话说,您正在使事情变得更加复杂。作为奖励,使用两个迭代器可以让您完全不受惩罚地交换容器。

标签: c++ list pointers return-by-reference


【解决方案1】:

尽管 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)     

【讨论】:

  • 谢谢!那确实解决了它,但我同意,我一定会回去尝试重写它。非常感谢您的帮助:)
  • @RoryChatterton 很高兴它成功了。我所指的示例可以在at this link 找到。它可以做得更好,包括使用 SFINAE 来确保被迭代的数据的基本类型是属性或属性衍生物,但我希望它提供一些值得思考的东西。再次,很高兴你已经启动并运行。 (并对答案 +1)。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2021-07-28
  • 2020-01-22
  • 2015-02-13
  • 2020-06-14
  • 2014-09-11
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多