0

我有一个由整数和字符串组成的类,但我在该类中也有一个向量。我必须从文件中读取记录,然后在解析每一行后,将信息放入我的类向量中。我必须获取基本的包信息,如 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

4 回答 4

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

您也可以通过在不首先检查它是否为空的情况下不尝试访问向量来避免它。

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

于 2012-09-04T15:13:14.637 回答
1
 packs.push_back(pack);

要将副本推pack送到您的向量中。因此,您将有两个特定实例:如果您在其中一个上调用 putData,则另一个不会自行修改!因此,写的时候

patients[0].bservice[0]

您的应用程序崩溃是因为您没有putData在里面patients[0],只有在里面pack——这又是一个不同的对象。

您应该修改您的向量,以便它存储指向package's 的指针,并推入pack内部的地址。

于 2012-09-04T15:15:26.600 回答
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

于 2012-09-04T15:15:48.607 回答
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;
}
于 2012-09-04T15:29:15.987 回答