2013-07-10 189 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