从向量类向量中读取数据 - c ++

POD*_*POD 0 c++ class vector

我有一个由int和字符串组成的类,但我在该类中也有一个向量.我必须从文件中读取记录,然后在解析每一行之后,将信息放在我的类向量中.我必须获取ID和名称等基本包信息,然后添加随该包提供的服务,因此我可以拥有10个来自一个包的记录,但它们的服务类型不同.现在我正在尝试将数据放在每个包中并从每个元素访问数据,但是当我试图从类中的向量中获取数据时,我的编译文件崩溃了.它还打印出1233和foo,但不是测试.任何想法为什么会这样?

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;

}
Run Code Online (Sandbox Code Playgroud)

定义的类是:

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);
    }

};
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 5

在这里,您可以复制packpush_back载入向量时:

packs.push_back(pack);
Run Code Online (Sandbox Code Playgroud)

在这里您可以访问pack,而不是存储在向量中的副本

pack.putData("test",12);
Run Code Online (Sandbox Code Playgroud)

因此,bservice您尝试访问的向量实际上是空的,这就是您尝试在此处访问它时代码崩溃的原因:

cout << patients[0].bservice[0].serviceID << endl; // patients[0].bservice is empty!!!
Run Code Online (Sandbox Code Playgroud)

您可以通过在致电后回复来避免这种情况putData:

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

您也可以通过不首先检查它是否为空来尝试访问向量来避免它.

理想情况下,您应该努力设计类而不是构造成有用状态,而不是默认构造它们并通过setter逐步添加数据.如果数据是相互关联的,并且类必须维护不变量,这一点尤为重要.