2

ファイルからデータを読み込んだので、そのデータをオブジェクトのベクトルとして保存したいと思います。

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ステートメントの最後と3番目の行がありませんでしたが、データにアクセスできなかったため、このメソッドをあきらめました。

助言がありますか?

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;
}
4

3 に答える 3

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;

厳密に必要な場合を除いて、動的に割り当てられたオブジェクトをポインターとして使用しないでください。コードサンプルでは、​​使用する理由がないようです。その場合は、スマートポインタを使用してメモリ管理を処理することを検討してください。

ポインターまたはスマートポインターvectorのいずれかを選択した場合は、演算子を使用して各要素のメソッドを呼び出す必要があることに注意してください。Thing->

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

using namespace std;ところで、特にヘッダーファイルでは、本当に避ける必要があります。

于 2012-09-02T12:16:51.947 に答える
2

コードには2つの問題があります。

  • Thingpush_backへのポインタを削除し、
  • まったく読み取っていませんv2(コピー/貼り付けのバグ。データをv12回読み取っています)。

ポインタのベクトルがあっても問題ありませんが、オブジェクトのメモリを管理するために多くの手作業を行う必要があるため、不便です。次のように、ベクトルunique_ptr<Thing>の代わりに使用できます。Thing*

vector <unique_ptr<Thing> > thingVector;
于 2012-09-02T12:19:08.097 に答える
1

あなたは使用する必要があります

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

これにより、ポインタではなくオブジェクトが渡されます。

また

cout << thingVector[0].getV1() << endl; // Convert to a function call.
于 2012-09-02T12:18:48.330 に答える