2011-12-26 41 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; 

} 

如果我想實現賦值運算符,避免使用引用作爲類成員是強制性的嗎?那麼地圖成員呢?我應該如何最終實現賦值運算符?

另一個極其重要的問題是我沒有意識到當我擦除持有播放器的向量的迭代器時,指針類成員指向的對象會發生什麼。任何幫助?

+0

「另一個問題」=>對初學者的另一個問題:) – xtofl 2011-12-26 13:41:58

+0

你想讓轉讓經營者與銀行做什麼? – fredoverflow 2011-12-26 15:33:57

+0

FredOverflow:只需將銀行復制到lhs對象 – arjacsoh 2011-12-26 17:14:05

回答

7

當你想要一個賦值操作符時,我會避免使用引用成員。如果您使用(智能)指針代替,你可以做

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

在當前形勢下,bank = other.bank會的other.bank的內容複製而不是指向this->bankother.bank引用的內容。

對於multimap類型的成員,它們可以毫無問題地複製,但請記住,您將得到一個「深」副本(因爲它們的類型爲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'. 

THEREFOR,含有基準只能初始化的對象,也!

確實如果你需要在一個類上賦值,該類不能有引用成員變量。 (實際上,它可以,但分配不能讓這些成員是指到另一個位置的問題)

當你想一想,這是有道理的:

參考概念定義「別名」的另一變量。別名意味着任何你對你的引用做的事情,你實際上對引用的位置做了什麼。當您將分配應用於此別名時,實際上您將分配給引用的位置。如果您可以使用任務指向不同的位置,則參考的目的將會丟失。

如果後者是你需要的,你應該使用一個指針。