0

我对 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;
}
4

3 回答 3

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;
}
于 2013-07-10T17:41:25.147 回答
0
foreach(Obj o, this->objVector) {
    if(..found..) {
        found = &o;

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

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

于 2013-07-10T14:54:57.223 回答
0

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

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

        break;
    }
}

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

于 2013-07-10T15:08:01.660 回答