访问对象向量中的数据
Accessing data from a vector of objects
我从文件中读取了数据,并希望将数据存储为对象的向量。
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文件
#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文件
#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;
}
您的问题是存储指向Thing
的指针,但删除了指针。因此,向量最终充满了悬空指针。您可以通过简单地使用Things
:的向量来避免所有这些问题
vector <Thing> thingVector;
...
thingVector.push_back(Thing(v1,v2,v3,v4));
然后你可以这样访问它:
std::string s = thingVector[0].getV1();
或
cout << thingVector[0].getV1() << endl;
除非绝对必要,否则不应该使用动态分配对象的指针,在您的代码示例中,似乎没有理由这样做。如果这样做,请考虑使用智能指针来处理内存管理。
注意,如果您选择了Thing
指针的vector
或智能指针,那么您将不得不使用->
运算符调用每个元素的方法:
cout << thingVector[0]->getV1() << endl;
// ^ here!
顺便说一句,你真的应该避免using namespace std;
,尤其是在头文件中。
您的代码有两个问题:
- 您正在删除指向推回的
Thing
的指针,并且 - 您根本没有读取
v2
(复制/粘贴错误;您将数据读取到v1
中两次)
虽然有一个指针向量是可以的,但这是不方便的,因为您必须做大量的手动工作来管理对象的内存。您可以在矢量中使用unique_ptr<Thing>
而不是Thing*
,如下所示:
vector <unique_ptr<Thing> > thingVector;
您应该使用
vector <Thing> thingVector;
...
thingVector.push_back(*thingDetails);
这将传递对象而不是指针。
还有
cout << thingVector[0].getV1() << endl; // Convert to a function call.
相关文章:
- 很好的语法来获取对向量/数组数据的大小引用?
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 如何以"union-like"方式更改C++向量的数据类型
- 在线程函数中处理数据向量时进行线程竞速
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 初始化可变数据结构中的共享指针向量
- 如何使用模板获取向量中的数据类型?
- 从自定义数据类型向量中删除重复元素
- C++:自定义数据类型向量错误的队列
- 如何将csv中的数据放入c++中的字符串向量中,而绝对没有任何作用
- 如何有效地实现将向量的数据分配给多个变量?
- 如何从多维向量中提取数据
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 向量中的数据何时释放
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 如何高效更改向量中所有对象的成员数据?
- 使用算法查找自定义数据向量中的最大值和最小值
- 从逗号分隔的文本文件中创建有意义的数据向量的最佳方法是什么?
- 为什么清除后我仍然可以访问数据向量