2

質問があります:

class B : public class A {
public:
  vector<int*> vec; 
};

class A  {
};

vector<A*> vec_a;
vector<B*> vec_b;

クラスのオブジェクトをB両方のベクトルにプッシュバックした場合。

B* b = new B;
vec_a.push_back(b);
vec_b.push_back(b);

その後、 class のオブジェクト内で何かを変更しB

そのような:

int* i = ....
vec_b[0].push_back(i);

vec_a変わりますか?

ベクトルpush_backの場合、コピーのみが作成されることを確認したので、私はそれと混同しています。しかし、上記のコードで確認すると、変更されます。2 つのベクトルは object の共有メモリを保持していますbか?

ありがとう

4

5 に答える 5

2

vectorはい、コピーを作成するときにプッシュします。ただし、あなたの場合、実際のオブジェクトのコピーではなく、ポインターのコピーです。

于 2012-08-23T06:45:29.770 に答える
1

両方のベクトルに同じオブジェクトへのポインターを配置しているため、 の要素からポイントされたオブジェクトへの変更は、 の要素にvec_aも影響しvec_bます。

于 2012-08-23T06:44:58.537 に答える
1

はい。結局、作成するオブジェクトは 1 つだけです。ポインタをプッシュします。したがってstd::vector、ポインターをコピーしますが、ポインターが指すメモリを変更します。だからこそ、あなたはあなたの結果を得るのです。ポインタについてもう少し読むことをお勧めします。

于 2012-08-23T06:45:22.710 に答える
1

ベクトルには、共通オブジェクトへのポインターが含まれています。したがって、これらのポインターのいずれかの逆参照を介してそのオブジェクト内で変更したものはすべて、それらが指しているオブジェクトに反映されます。ポインターをベクターに追加すると、ポインターが指すオブジェクトではなく、ポインター自体のコピーが作成されます。クラスの共通インスタンスBを両方のベクトルに追加した場合、各ベクトルにはそのオブジェクトの個別のコピーが含まれます。ポインターを追加すると、元のポインターのコピーが各ベクターに追加されますが、両方のコピーは同じ値を持ち、それが指すオブジェクトのメモリ アドレスになります。

于 2012-08-23T06:46:01.303 に答える
0

vector push_back メソッドは確かにコピーを作成します。ただし、(vec_a および vec_b への) ポインターのベクトルを指定したため、これらのポインターをコピーしても元のオブジェクトは実際には変更されません。を使用すると、最初に期待したものが得られます

vector<A> vec_a;
vector<B> vec_b;

代わりに、それらのベクトルを

B b;
vec_a.push_back(b);
vec_b.push_back(b);

実際に b の内容をベクトルにコピーします。一方を変更しても、他方には影響しません。

于 2012-08-23T07:05:33.883 に答える