2013-07-10 150 views
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; 
} 
+0

你的代码似乎试图记住你正在寻找的东西,而不是向量中的任何东西。你真的*试图做什么? – doctorlove

+0

这是什么语言? – juanchopanza

+0

@doctorlove你是什么意思?是的,我想记住指向找到的对象的指针。 – schlimpf

回答

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; 
} 
+0

He *确实将矢量保存在同一个类中 - 构造函数初始化器列表以及this-> objVector的使用是问题中的线索,但他应该尽可能避免名称歧义。 – Pete

+0

是的,你是对的。我错过了构造函数初始值设定项。我将编辑答案。 –

+0

@何塞里奥斯,为什么这一切都被剔除?你不应该那样做。请删除三振出局,并只保留答案的最新版本(最正确)。 –

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

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

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

+0

谢谢,但是如果我使用指向Vector中对象的指针,它会保存吗?我想不是,还是我错了? – schlimpf

+0

如果你不采取o的地址,哪个会在函数结束时消失,那么它会更坏 – doctorlove

+0

更坏不代表正确,是吗? :D – schlimpf

0

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

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

     break; 
    } 
} 

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

+1

哦 - 没有人提到每个提升。它仍然看起来像我的伪代码 – doctorlove

+0

我不认为在Q_FOREACH循环之外'found'是有效的,因为Q_FOREACH遍历容器的_copy_。 – cgmb

+0

@ Slavik81不,它不是 – Pete