我有一个由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)
在这里,您可以复制pack当push_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逐步添加数据.如果数据是相互关联的,并且类必须维护不变量,这一点尤为重要.
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |