对元素的指针在传染媒介

时间:2013-07-10 14:52:55

标签: c++ qt

我对c ++很新,并且已经阅读了一些关于在向量中存储指向对象或对象本身的指针的主题。 我决定将对象存储在向量中,因为我没有在运行时push_back很多对象,向量只是创建一次并像这样离开。

我现在的问题是,我有另一个对象,它将一个向量作为参数,并在传递的向量中搜索某个对象。如果找到此对象,则会存储指向该对象的指针,否则,该变量将设置为NULL

虽然我没有push_back任何项目,但指针似乎指向其他功能中的错误位置。 在向量中搜索元素的对象具有一个公共函数,其中应返回指针。如果我在每个函数调用中搜索对象,那将会非常慢,所以这不应该是一个选项。 还有其他解决方案,还是我必须切换到指针向量?

一些代码段:

搜索向量的对象的构造函数:

MySearch::MySearch(QVector<Obj> objVector)
    :objVector(objVector) {
    found = NULL
    foreach(Obj o, this->objVector) {
        if(..found..) {
            found = &o;

            break;
        }
    }
}

吸气功能:

Obj* MySearch::getObject() {
    return found;
}

3 个答案:

答案 0 :(得分:1)

问题是因为变量o是本地的,并且一旦循环结束就会超出范围。如果你取向量元素的地址而不是o,它将起作用。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class MySearch
{
public:
  MySearch(const vector<string> &items)
    : items_(items) 
  {
    // Skipping validation
    found_ = &(items_[5]);
  }

  string *getObject() {return found_;}

private:
  vector<string> items_;
  string *found_;
};

int main()
{
  string str = "test#";
  vector<string> aux;
  for (int i = 0; i < 10; ++i)
    aux.push_back(str + (char)('0' + i));  // test#0 ... test#9   

  MySearch ms(aux);
  cout << *(ms.getObject()) << endl; // test#5

  return 0;
}

答案 1 :(得分:0)

foreach(Obj o, this->objVector) {
    if(..found..) {
        found = &o;

        break;
    }
} // life time of o ends here.

o驻留在堆栈上,它的生命周期仅限于循环。引用它并稍后返回会导致未定义的行为。

答案 2 :(得分:0)

如果您要使用BOOST_FOREACH(来自boost C ++库),那么您可以对向量中的对象使用非const引用。 Q_FOREACH不支持非const引用:

BOOST_FOREACH(Obj& o, this->objVector) {
    if(..found..) {
        found = &o;

        break;
    }
}

或者使用迭代器和for循环。