2013-04-12 176 views
0

我正在查詢一個查詢MySQL數據庫的應用程序。創建多個具有相同名稱的類對象? C++

我想這樣做的結果將被存儲在一個圖(其具有相應的一對):

std::map<int, Car*> m_car; 
typedef std::pair<int, Car*> m_car_pair; 

的汽車對象是由8個參數,其中之一是car_id所以,首先我拉汽車ID並將其用作鑰匙,然後我想將整個汽車對象存儲爲地圖的值。 (我知道這是包裝我要存儲car_id兩次,但目前我不介意)。

反正這裏是我的查詢代碼:

void DatabaseController::getAll(QString query_string) 
{ 
    // Console log message 
    std::cout << "Querying Database" << std::endl; 

    /// Declare SQL query and pass function parameter 'query' 
    QSqlQuery query(query_string); 

    // execute the query 
    query.exec(); 

    int count = 0; 

    // While results are coming in 
    while(query.next()) 
    { 
     // Call car constructor passing all parameters 
     Car car(query.value(count).toInt(), query.value(count+1).toString(), query.value(count+2).toString(), query.value(count+3).toString(), 
      query.value(count+4).toInt(), query.value(count+5).toInt(), query.value(count+6).toInt(), query.value(count+7).toString()); 

     if (car.getcarID() != 0) 
     { 
      m_car_records.insert(m_car_pair(car.getcarID(), &car)); 
     } 
    } 

    std::cout << "Database query finished" << std::endl; 

這個我做了一個快速測試功能遍歷在地圖上,並把所有的ID的(圖鍵),並檢查它們是不同的後(即函數工作)他們是。

但這只是一個檢查,我需要的是能夠從汽車上調用應該在地圖上的汽車對象的附件功能。所以,我用同樣的快速測試功能遍歷地圖和cout << car.toString();(一個簡單的字符串函數在汽車類)結束:

void DatabaseController::test() 
{ 
    m_car_records_iterator = m_car_records.begin(); 

    for(unsigned int i = 0; i < m_car_records.size(); i++) 
    { 
     car *test = m_car_records_iterator->second; 
     std::cout << test->toString() << std::endl; 
     m_car_records_iterator++; 
    } 
} 

這表明結果的正確數量不過他們都是即車相同已添加到地圖中的每個條目的對象是同一

我的問題是(對,是由該查詢找到的最後一個記錄的值)...

有什麼辦法,使用這個結構我目前已經爲我的查詢創建並添加了這些類obj在while循環中使用相同的名字來映射到我的映射,因爲當然我不知道有多少結果被返回併爲每個對象聲明一個類對象,但是因爲它使用相同的名稱,所以只需添加每次都是一樣的,實際上並沒有取代這些值......至少那是我認爲正在發生的事情?

任何意見或想法將

+0

將一個本地堆棧變量'car'的地址重複插入到您的地圖中可能不會達到您想要的。我會從那裏開始。 – WhozCraig

回答

2

遇到未定義行爲歡迎(遺憾的長期職位)。原因是你在地圖中插入了一個指向局部變量的指針。

getAll的循環中,當循環重新開始下一項時,car變量不再有效。

我建議你看看指針std::shared_ptr

+0

乾杯傢伙現在都在工作 – AngryDuck

+0

這兩個答案同樣正確,但你確實回答了第一個如此糟糕的接受你,儘管如此,多虧了 – AngryDuck

2

這是您的problem--

Car car(...); // ***Stack allocated 

if (car.getcarID() != 0) 
{ 
    m_car_records.insert(m_car_pair(car.getcarID(), &car)); 
} 
    //But the pointer is what's stored 

當循環迭代中,Car實例被破壞,指針懸,導致不確定的行爲。您需要

Car* car = new Car(...); 

,然後當不再需要m_car,則需要遍歷和deleteCar值。

+0

通常,不會將原始指針放入任何'std'容器,例如'vector','map'等等。有什麼意義?把你的實際對象放在那裏。 –

+0

@Joker_vD運行時多態性。 'shared_ptr'等是另一種選擇,但並非總是必要的,基本/派生的轉換在它們中有點棘手。 –

+1

ohhh歡呼哈哈很容易修復現在所有的工作(以及如果真的這樣的菜鳥錯誤*這肯定它是*新的C++)歡呼幫助人們 – AngryDuck

相關問題