私が書いているコードに問題があります。私はこの結果を元にしてこの例に煮詰めました。オブジェクトへのポインタのベクトルのC++の不一致
基本的に、私は1つのクラスで出会って別のクラスに渡すオブジェクトへのポインタのベクトルを持っています。私は、イテレータを使ってこのベクトルを調べることによって、NULLやゴミ値を見つけることができますが、伝統的なfor-loop runthroughを使用するとすべてうまくいくことに気付きました。ここで
はコードです:
#include <iostream>
#include <vector>
using namespace std;
class MyObject
{
public:
int a;
int b;
MyObject(int _a, int _b)
{
a = _a; b = _b;
}
};
class Builder
{
public:
Builder() {
obj_vector.push_back(new MyObject(1, 2));
obj_vector.push_back(new MyObject(3, 4));
}
vector<MyObject*> getObjectVector() { return obj_vector; }
private:
vector<MyObject*> obj_vector;
};
class MyObjectHolder
{
public:
MyObjectHolder()
{
Builder builder;
obj_vector = builder.getObjectVector();
}
vector<MyObject*> getObjectVector() { return obj_vector; }
private:
vector<MyObject*> obj_vector;
};
int main()
{
MyObjectHolder holder;
for (vector<MyObject*>::iterator itr = holder.getObjectVector().begin(); itr != holder.getObjectVector().end(); ++itr)
{
if ((*itr) == NULL) {
cout << "NULL" << endl;
}
else
{
cout << (*itr)->a << "\t" << (*itr)->b << endl;
}
}
cout << endl;
for (unsigned int i = 0; i < holder.getObjectVector().size(); i++)
{
if (holder.getObjectVector()[i] == NULL)
cout << "NULL" << endl;
else
cout << holder.getObjectVector()[i]->a << "\t" << holder.getObjectVector()[i]->b << endl;
}
return 0;
}
は、このプログラムの出力は次のようになります。イテレータオブジェクトはガベージ値を生成する理由
0 0
3 4
1 2
3 4
は、だから私は思ったんだけど。他のインスタンスでは、反復子はNULLと等しくなります。私はそれがオブジェクトの間に渡されている間スコープの外に出ているオブジェクトのいくつかと関係があると思っていますが、どこで、なぜか分かりません。新しいvector
を返しholder.getObjectVector()
おかげ
良い点。参照はここで意図した修正のように見えます。 – Flexo
@awoodlandは、その点を強調するために編集していました。 – hmjd
ああ、とても簡単!面白いことに、私は今までリファレンスを返す理由がなかった。おそらく、なぜベクターのコピーが.begin()と.end()がここで不思議な動作をし、「無関係」という意味であるのかをさらに説明できますか? –