2

私がやりたいのは、 A を引数として取り、新しい A を初期化して引数 A のディープコピーにするコピーコンストラクターを定義することです

public class A<E extends Comparable<? super E>> implements B<E> 
{
    private A a;
    private E[] hArray;

    // What I tried .... my copy constructor

    public A(A other)
    {
         this.a = other;  // deep copy
    }
}

これは、コピー コンストラクターを介してディープ コピーを行う正しい方法ですか??

4

2 に答える 2

4

それはディープコピーではありません。他のオブジェクトへの参照を保存しているだけです。

これを試して:

public A(A other) {
    if(other.a != null) {
        this.a = new A(other.a);
    }
    if(other.hArray != null) {
        this.hArray = new E[other.hArray.length];
        for(int index = 0; index < other.hArray.length; index++) {
            this.hArray[index] = other.hArray[index].clone();
        }
    }
}

これは、E にもディープ コピーを実行するコピー コンストラクターがあることを前提としています。さらに、E がジェネリックであることに気付いたので、私のコードはそれに対して正しく機能しない可能性があります (ただし、アイデアはそこにあります)。

于 2012-11-23T01:49:04.783 に答える
1

ディープコピーが必要な場合は、単に割り当てることはできません-それはディープコピーの意味ではありません。あなたは行く必要があります:

public A(A other)
{
    if(other != null) {
        this.a = new A(other.a);  // deep copy
    } else {
        this.a = null;
    }
}

ただし、これは再帰的コピーであり、あらゆる種類の無限ループが発生する可能性があります。また、どういうわけかディープ コピーする必要がありE、それらのジェネリックは私の頭を悩ませているので、どのようにそれを行うかについて推測しようとはしません。

于 2012-11-23T01:45:29.963 に答える