2016-11-18 10 views
1

こんにちは私はポーカーゲームを作っています。私はこの浅いコピーコンストラクタは間違っているが、なぜそれは間違っているのですか?アーリーリストの浅いコピー

public Deck() { 
    cards = new ArrayList <Card>(); 

    for (int type= 0; type<=4; type++){ 
     for (int value=1; value<9; value++){ 
      Card newCard = new Card (value, type); 
      cards.add(newCard); 
     } 
    } 

} 

public Deck(Deck other) { 
    ArrayList<Card> cardsCopy = cards; 

    } 

答えて

1
public Deck(Deck other) { 
    ArrayList<Card> cardsCopy = cards;  
    } 

ここcardsCopyDeckインスタンスとは関係ありません。これは、コンストラクターが実行を終了するとすぐには存在しない独立変数です。
otherDeckの浅いコピーを作成するには、作成するコピーのcardsフィールドにotherインスタンスのcardsフィールドへの参照を割り当てる必要があります。

浅いコピーコンストラクタは次のようになります。

public Deck(Deck other) { 
    cards = other.cards; 
} 

しかし、あなたはあなたの質問のタイトルに尋ねると、オリジナルで、コピーの両方のcardsフィールドを参照するので、それはArrayListの浅いコピーではありません同じオブジェクト。

ArrayListの浅いコピーと浅いコピーコンストラクタを持っているために、あなたができる:

public Deck(Deck other) { 
    cards = new ArrayList<Card>(other.cards); 
} 

ArrayListで定義されたclone()方法を使用します。

public Deck(Deck other) { 
    cards = other.cards.clone(); 
} 
関連する問題