从对象向量访问数据

时间:2012-09-02 12:14:40

标签: c++

我已从文件中读取数据,并希望将数据存储为对象矢量。

vector <Thing*> thingVector;
for (int i = 0; i < 10; i++) {
// Read in contents of file
getline(fileName, v1, ',');
cout << v1 << endl;
getline(fileName, v1, ',');
cout << v2 << endl;
getline(fileName, v3, ',');
cout << v3 << endl;
getline(fileName, v4, '\n');
cout << v4 << endl << endl;
// Store
Thing* thingDetails = new Thing(v1, v2, v3, v4);
thingVector.push_back(thingDetails);
delete thingDetails;
}
thingFile.close();
cout << "Size of THING vector is " << thingVector.size() << endl; // Displays 10

cout << thingVector[0].getV1 << endl; // ERROR HERE

如何将每条记录存储在向量中,然后访问数据?

我也试过这样做:     thingVector.push_back(Thing(v1,v2,v3,v4));

当我尝试这样做时,我没有for语句中的最后一行和倒数第三行,但我无法访问数据,所以放弃了这种方法。

有什么建议吗?

THING .H FILE

#ifndef THING_H
#define THING_H

#include <string>

using namespace std;

class Thing {
public:

Thing(string v1, string v2, string v3, string v4);
string getV1();
string getV2();
string getV3();
string getV4();

private:
string v1;
string v2;
string v3;
string v4;
};

#endif

THING .CPP FILE

#include "thing.h"

#include <string>

using namespace std;
Thing::Thing(string aV1, string aV2, string aV3, string aV4) {
v1 = aV1;
v2 = aV2;
v3 = aV3;
v4 = aV4;
}

string Thing::getV1(){
return v1;
}

string Thing::getV3(){
return v2;
}

string Thing::getV3){
return v3;
}

string Thing::getV4(){
return v4;
}

3 个答案:

答案 0 :(得分:3)

您的问题是您存储指向Thing的指针,但正在删除指针。因此,向量最终会充满悬空指针。只需使用Things

的向量,即可避免所有这些麻烦
vector <Thing> thingVector;
...
thingVector.push_back(Thing(v1,v2,v3,v4));

然后你可以像这样访问它:

std::string s = thingVector[0].getV1();

cout << thingVector[0].getV1() << endl;

除非严格必要,否则不应使用指针动态分配对象,并且在代码示例中似乎没有理由这样做。如果这样做,请考虑使用smart pointers来处理内存管理。

注意,如果您选择了vector Thing指针或智能指针,那么您必须使用->运算符调用每个元素的方法:

cout << thingVector[0]->getV1() << endl;
                  //   ^ here!

顺便说一下,你应该真的避免using namespace std;,特别是在头文件中。

答案 1 :(得分:2)

您的代码存在两个问题:

  • 您正在删除指向您推送的Thing
  • 的指针
  • 您根本没有阅读v2(复制/粘贴错误;您正在将数据读入v1两次)。

虽然可以使用指针向量,但这很不方便,因为你必须做大量的手工工作来管理对象的内存。您可以在向量中使用unique_ptr<Thing>代替Thing*,如下所示:

vector <unique_ptr<Thing> > thingVector;

答案 2 :(得分:1)

你应该使用

vector <Thing> thingVector;
...
thingVector.push_back(*thingDetails);

这将传递对象而不是指针。

另外

cout << thingVector[0].getV1() << endl; // Convert to a function call.