2011-12-26 16 views
11

以前の質問Overloaded assignment operator causes warning about recursionから新しい問題が増えている限り、私はこれを新しいものとして投稿することが正当化されました。クラスのPlayerに参照クラスメンバーがあり、このクラスのコピーコンストラクターと代入演算子(=)を実装したいと考えています。関数vector.eraseがうまく動作するのは、それがなければ、私が心配している限り正しく動作しないからです。私はベクトルを使う:vector allPlayers;クラスのプレーヤーのメンバーは以下のとおりです。参照クラスメンバーを持つ代入演算子

class Player 
{ 

    private: 
    int ID; 
    int pMoney; 
    int doubleIndicator; 
    int squarePosition; 
    Bank& bank; 
    string pName; 
    Square* capturedSquare; 
    multimap<string, PropertySquare*> squaresColBought; 
    multimap<string, House*> housesColBuilt; 

} 

それは私が代入演算子を実装する場合、クラスのメンバーとして参照の使用を避けるためには必須ですか?地図のメンバーはどうですか?私は最終的に代入演算子をどのように実装するべきですか?

私が気づいていない最も重要なもう一つの問題は、Playerを保持するベクトルのイテレータを消去すると、ポインタのクラスメンバが指すオブジェクトに何が起こるかです。どんな助け?

+0

「別の問題」=>別の質問: – xtofl

+0

代入演算子で銀行に何をしたいですか? – fredoverflow

+0

FredOverflow:銀行をlhsオブジェクトにコピーするだけです – arjacsoh

答えて

7

代入演算子が必要な場合は、参照メンバーの使用を控えます。あなたの代わりに(スマート)ポインタを使用する場合は、あなただけの現在の状況では

Player &operator=(Player const &other) 
{ 
    bankPtr = other.bankPtr; 
    // copy other members 
} 

を行うことができ、bank = other.bankではなくother.bankで参照される内容にthis->bankを指しているのother.bankの内容をコピーします。

タイプメンバーの場合は、問題なくコピーすることができますが、キーのコピーは「string」であるため「深い」コピーが得られますが、「浅い」 "ポインタの値のコピー、それであなたは共有状態になります。値にはshared_ptrを使用します。

13

A C++ '参照' は唯一の割り当てられていない、初期化することができます。

int value1(1), value2(2); 
int& ref1 = value1; // OK 
int& ref2; // compile error: reference not initialized 
int& ref3=ref1; // OK: ref3 refers to the same variable as ref1 
ref1=value2; // equivalent to 'value1=value2'. 

そのため、参照を含むオブジェクトは、あまりにも、初期化することができます!

本当に:クラスへの代入が必要な場合、そのクラスには参照メンバー変数はありません。あなたはこれについて考えるとき(実際のところ、それはできますが、割り当ては、これらのメンバーが別の場所を参照することはできません)

、それは理にかなって:

参照概念は、別のために「エイリアス」を定義します変数。エイリアシングは、あなたが参照するものは何でも、参照先の場所に実際に行うことを意味します。このエイリアスに割り当てを適用すると、実際には参照先の場所に割り当てられます。割り当てを使用して別の場所を指すようにすることができれば、参照の目的は失われます。

後者が必要な場合は、ポインタを使用する必要があります。

関連する問題