私のC++コードには、int型のidフィールドを持つクラスオブジェクトがあります。今私はObject *型のポインタのベクトルを作成したいと思います。最初に試しましたポインタのC++ベクトルを作成する
vector<Object*> v;
for(int id=0; id<n; id++) {
Object ob = Object(id);
v.push_back(&ob);
}
しかし、ここでは同じアドレスがn回だけ繰り返されるため、これは失敗しました。私が新しい演算子を使用した場合、私が望むものを得ることができますが、動的メモリ割り当てを避けたいと思います。それから、私は必要なものがforループの前にn個の異なるポインタを宣言することだと思った。これに簡単な方法は、私がこれをしなかったので、配列を宣言することです:
vector<Object*> v;
Object ar[n];
for(int i=0; i<n; i++) {
ar[i] = Object(i);
}
for(int i=0; i<n; i++) {
v.push_back(ar+i);
}
はまだ私はそれをこのように行うとメモリリークを取得する可能性がありますか?また、配列宣言を行うことは、私の意見では少し不器用です。ポインターのベクトルを作成する他の方法はありますか?手動でのメモリ管理は避けてください。
EDIT:単純なオブジェクトの代わりにポインタを使用するのはなぜですか?
私はこのように思っていたので、元の実際の状況を少し変更しました。これは、可能な限り単純な形式で質問を表すことができます。とにかく、なぜ私はポインターのベクトルが欲しいのか分からずに質問に答えられると思う。
は、実際に私は、私はタイプObject
のオブジェクトとメンバーフィールドvec
を埋めたい派生クラスB
で
Class A {
protected:
vector<Superobject*> vec;
...
};
Class B: public A {...};
Class Superobject {
protected:
int id;
...
}
Class Object: public Superobject {...}
を持っています。スーパークラスがポインタを使用しなかった場合、私はオブジェクトのスライスに問題があります。だからクラスB
のコンストラクタでObject*
のポインタのベクトルとしてvec
を初期化したいと思います。
EDIT2
はい、動的な割り当てが合理的選択肢であるように私には思えるし、配列を使用するという考えは悪い考えです。配列が有効範囲外になると、ベクター内のポインタがオブジェクトを必ずしも必要としないメモリ位置を指し示すため、事態はうまくいかなくなります。
は、クラスBのコンストラクタでは、私はB(int n) {
vector<Object*> vec;
Object ar[n];
for(int id=0; id<n; id++) {
ar[id] = Object(id);
}
for(int id=0; id<n; id++) {
v.push_back(ar+id);
}
}
これは
動的メモリ割り当てをしたくない場合は、なぜポインタを使用していますか?また、Objectの配列を操作することもできます。 –
なぜポインタを最初に格納したいのですか? – Yuushi
2番目の方法の問題は、それが正当なC++ではないということです。 'Object ar [n];'は、nが定数でない限り正当ではありません。また、あなたの編集によれば、クラス階層がありますが、 'Object ar [n];であるので、あなたはスーパーオブジェクトではなくオブジェクトしか持っていません。あなたが破壊されたオブジェクトのアドレスを格納しているという理由で、最初の方法も間違っています。私はちょうど動的メモリ割り当てを使用します。 – john