1

次のようなコードがあります。

MyClass* a = new MyClass();
vector[0] = *a;

MyClass KeepCopy = vector[0];

//
//
vector gets changed
//
//

return KeepCopy

これで vector が実行され、多くの処理が行われ、オーバーライドされます。ただし、関数の最後に KeepCopy の値を返したいと考えています。ただし、 vector[0] は他の何かを指していないため、間違ったデータが返されていると思います。

EDIT3:これが起こっていることです。KeepCopy は vector[0] に割り当てられ、コードで vector[0] に詰め込みます。KeepCopy はまだ vector[0] のバージョンを指していると考えていましたが、KeepCopy には、割り当てが行われた時点での値のコピーしか含まれていないようです。

後で、ベクターを別のベクター オブジェクトに割り当てます (一度に 2 行のテキスト ファイルを読み込んでいます。ベクターには 1 行が含まれ、この別のベクター オブジェクトには 2 行目が含まれます)。KeepCopy が元の vector[0] 要素を指していることを確認するにはどうすればよいですか (テキスト ファイルの各行の解析を開始して、ベクトルを再割り当てする前に)。

4

4 に答える 4

1

まったく同じように:元のオブジェクトのコピーにMyClass KeepCopy = vector[0];設定さKeepCopyれます(コピーコンストラクターを介して)。このコピーはベクターとは関係がないため、ベクターを変更しても影響を受けません。

于 2012-05-27T16:17:12.560 に答える
1

MyClass のコピー コンストラクターを実装し、オブジェクトをコピーします。ポインターではありません。

于 2012-05-27T16:15:22.093 に答える
1

オブジェクトを (ポインター/参照ではなく) 値で格納しているため、インスタンスに含まれる同じオブジェクトへのポインターを共有しない限り、への変更は にvector[0]反映されません。KeepCopyMyClass

この場合は、オリジナルのディープ コピーを作成する適切なコピー コンストラクターを実装する必要があります (ポインターの値を盲目的にコピーするデフォルトの浅いコピーの代わりに)。

于 2012-05-27T16:16:53.227 に答える
0

私があなたを正しく理解していれば、関数で次の手順が行われます

  1. それを変更する vector[0] でいくつかのことを行います。
  2. ベクトル全体を再割り当てします。

そして、ステップ 1 の後、ステップ 2 の前の vector[0] の状態が返されます。これが、コピーを作成する必要があるコード内のポイントです。

MyClass foo()
{
    //
    // some stuff
    //

    MyClass* a = new MyClass();
    vector[0] = *a;

    //
    // vector[0] gets modified
    //

    // you want vector[0]'s value here, so this is where you should create the copy
    MyClass KeepCopy = vector[0];


    //
    // Whole vector gets reassigned
    //

    return KeepCopy
}
于 2012-05-27T16:52:55.300 に答える