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

时间:2012-09-04 15:09:06

标签: 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;

}

定义的类是:

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 个答案:

答案 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;
}