我有一个由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;
}
定义的类是:
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);
}
};
答案 0 :(得分: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逐步添加数据。如果数据是相互关联的,并且类必须保持不变量,这一点尤为重要。
答案 1 :(得分:1)
packs.push_back(pack);
将pack
的副本推送到您的向量中。因此,您将有两个特定的实例:如果您在其中一个上调用putData,则另一个不会自行修改!
因此,写作时
patients[0].bservice[0]
您的应用程序崩溃是因为您putData
内没有patients[0]
,只在pack
内 - 这又是一个不同的对象。
你应该修改你的向量,以便存储指向package
的指针,然后推送pack
的地址。
答案 2 :(得分:0)
pack.push_back(pack);
假设第一个pack
实际上是packs
,则会将pack
的副本推送到向量上。
pack.putData("test",12);
这会修改局部变量pack
,但不您推送到矢量的副本。那仍然包含一个空的bservice
向量。
cout << patients[0].bservice[0].serviceID << endl;
假设patients
实际上是packs
,则会错误地尝试从空bservice
向量中读取。
您要么在putData
之前致电packs.push_back(pack)
,要么在packs.back()
而不是本地pack
上致电。
答案 3 :(得分: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;
}