2012-09-04 20 views
0

我有一個由int和字符串組成的類,但是我在該類中也有一個向量。我必須從文件中讀取記錄,然後在解析每行之後,將信息放入我的向量類中。我必須獲得ID和名稱等基本包信息,然後添加隨包提供的服務,因此我可以從一個包獲得10條記錄,但它們在服務類型方面存在差異。現在我正試圖將數據放在每個包中,並從每個元素訪問數據,但是當我試圖從類中的矢量中獲取數據時,編譯的文件崩潰。它也打印出1233和foo,但不是測試。任何想法是爲什麼?從類的向量中讀取數據 - C++

int main() 
{ 
    vector<package> packs; 
    package pack; 
    pack.ID = 1233; 
    pack.name = "foo"; 
    packs.push_back(pack); 

    pack.putData("test",12); 




    cout << packs[0].name << endl; 
    cout << packs[0].ID << endl; 
    cout << packs[0].bservice[0].serviceID << endl; //[b]Crashes in this line[/b] 

    return 0; 

} 

定義的類是:

class package 
{ 
    public: 

    class aservice 
    { 
     public: 
     int serviceID; 
     string othername; 
    }; 
    int ID; 
    string name; 
    vector<aservice> bservice; 
    void putData(string name1, int serviceID1) 
    { 
     aservice obj; 
     obj.serviceID = serviceID1; 
     obj.othername = name1; 
     bservice.push_back(obj); 
    } 

}; 
+4

其中'patients'聲明? – hmjd

+0

顯示的代碼甚至不會編譯(「患者」未在任何地方定義/聲明)。所以如果我們給你合理的答案而不是猜測,請給我們看看完整的代碼;如果可以的話,將實際問題縮減爲儘可能少的代碼! – codeling

+0

在你的例子中它應該是packs.push_back(pack); –

回答

5

在這裏,你做的pack當你push_back複製到載體:

packs.push_back(pack); 

在這裏,您可以訪問pack,而不是拷貝存儲在您的矢量

pack.putData("test",12); 

所以,你要訪問的bservice矢量實際上是空的,這就是爲什麼當你試圖在這裏訪問你的代碼崩潰:

cout << patients[0].bservice[0].serviceID << endl; // patients[0].bservice is empty!!! 

您可以通過調用putData後推背避免這種情況:

vector<package> packs; 
package pack; 
pack.ID = 1233; 
pack.name = "foo"; 
pack.putData("test",12); 
packs.push_back(pack); 

您也可以通過不試圖訪問一個向量沒有檢查是否是空的避免它。

理想情況下,您應該努力設計能夠構建爲有用狀態的類,而不是默認構建它們並通過setter逐步添加數據。如果數據是相互關聯的並且類必須保持不變量,這一點尤其重要。

+0

或者你可以通過調用默認構造的包上的'push_back'來避免它,然後對它的引用進行操作。 'packs.push_back(包()); Package&pack = packs [0];' –

+0

擴展了David的界限,如何用ctor-params推送構造對象來完全避免putData =)。 packs.push_back(Package(12,「test」)) – WhozCraig

+0

@CraigNelson我同意完全自我構建的對象是可取的,我將把它放在我的答案中。問題是,我認爲,有一個空矢量是有效的。 – juanchopanza

1
packs.push_back(pack); 

打算將pack的副本推送到您的矢量中。因此,您將有兩個特定的實例:如果您對其中一個調用putData,另一個將不會被修改! 因此,在編寫

patients[0].bservice[0] 

您的應用程序崩潰的時候,因爲你沒有putDatapatients[0],裏面只有pack - 這是再次,不同的對象。

你應該修改你的向量,以便它存儲指向package的指針,並把pack的地址放在裏面。

0
pack.push_back(pack); 

假設第一pack實際上是packs,這推動一個複製的pack到載體中。

pack.putData("test",12); 

這會修改本地變量pack,但副本你推到載體。這仍然包含一個空的bservice載體。

cout << patients[0].bservice[0].serviceID << endl; 

假設patients實際上是packs,這個錯誤地嘗試從空bservice矢量讀取。

您要麼在packs.push_back(pack)之前致電putData,要麼致電packs.back()而不是本地pack

0

試試這個:

#include <vector> 
#include <iostream> 

using namespace std; 

class package 
{ 
public: 
    package(int inID, const string& inName) : ID(inID), name(inName) 
    { 
    } 

    void putData(string name1, int serviceID1) 
    { 
     aservice obj; 
     obj.serviceID = serviceID1; 
     obj.othername = name1; 
     bservice.push_back(obj); 
    } 

    void Print() const 
    { 
     cout << ID << endl; 
     cout << name << endl; 

     vector<aservice>::const_iterator iter; 
     iter = bservice.begin(); 
     for (; iter != bservice.end(); ++iter) 
     { 
     cout << iter->serviceID << " " << iter->othername << endl; 
     } 
    } 

private: 
    class aservice 
    { 
    public: 
     aservice() {}; 
     int serviceID; 
     string othername; 
    }; 

    int ID; 
    string name; 
    vector<aservice> bservice; 


}; 

typedef vector<package> PackContainer; 
typedef vector<package>::iterator PackContainerIterator; 
typedef vector<package>::const_iterator PackContainerConstIterator; 

void PrintAll(const PackContainer& packs) 
{ 
    PackContainerConstIterator iter = packs.begin(); 
    for (; iter != packs.end(); ++iter) 
    { 
     iter->Print(); 
    } 
} 

int main() 
{ 
    PackContainer packs; 
    package pack(1233, "foo"); 
    pack.putData("test",12); 
    packs.push_back(pack); 
    PrintAll(packs); 


    return 0; 
}