2016-10-16 8 views
0

私はVECと呼ばれるカスタムベクトルクラスと、VECと呼ばれるVECのstd :: vectorを保持するDataクラスというクラスを持っています.VECは4つの値を格納する非常に単純なベクトルとして機能します。関数終了後にベクトルデータが消える

vector<VEC> v; 

他にも、2つの機能があります。プロセスと作成。私のprocess()は、Dataオブジェクトをパラメータとして受け入れ、その内容を変更することになっています。

VEC v1(1, 1, 1, 1); 
VEC v2(2, 2, 2, 2); 
VEC v3(3, 3, 3, 3); 
vector<VEC> temp; 
temp.push_back(v1); 
temp.push_back(v2); 
temp.push_back(v3); 

for (int i = 0; i < 3; i++) 
    { 
    data.v.push_back(vtemp[i]); 
    } 
cout << data.v.size() << endl; 

あなたが期待するように、これは3

を出力:この関数内

void myClass::process(Data data); 

は、私がvecSのの一時的なベクトルを作成すると、それはデータのVに内容をだ押し込み宣言されています

ここで問題が発生します。もう1つの関数create()は、ベクトルデータリスト内のすべてのDataオブジェクトに対してprocess()を呼び出します。テスト目的のために、これは最初の要素のみを使用します。これは、あなたが見ることができるように、それはプロセス()関数で正しく動作しますが、Vベクトルは、その関数が終了するとすぐに自分自身を空にするようで、

3 
0 

プリントアウトするものです

void myClass::create() { 
    process(dataList[0]); 
    cout << dataList[0].v.size() << endl; 
    } 

。これは問題です。なぜなら、process()が呼び出された後で新しいDataオブジェクトを保存するためには、各Dataオブジェクトが必要になるからです。何が起きてる?

+3

あなたは 'Data'のコピーで動作しているようです。それを変更する場合は、参照で引数を取ってください。 – krzaq

答えて

1

あなたDataオブジェクトを操作したい場合は、あなたのprocess機能はそのように宣言する必要があります:あなたはそれを渡すとき

void myClass::process(Data& data); 

あなたが参照渡しする必要があり、dataの他のコピーが行われます関数。上記の関数プロトタイプ内のDataの後のアンパサンド(&)は、「の変数dataへの参照を意味します。

あなたが持っていたやり方は、機能がdataになるように変更されますこのローカル変数にはだけです。したがって、process関数が終了すると、変更は破棄されます。

関連する問題