2011-12-25 44 views
0

的擦除功能拷貝構造函數:vector::erase with pointer memberRemove elements of a vector inside the loop,我還需要在vector.erase功能提供一些幫助。我被指示實現一個拷貝構造函數,使擦除函數在一個向量上工作,這在另一個問題中也提到了。在我的相關課程中實現一個函數操作符是非常重要的。在這樣做時,我在創建複製構造函數時遇到了另一個錯誤,我無法找到長時間的原因。錯誤是「Player :: Player(const Player & otherPlayer)不爲以下內容提供initiallizer:」。我究竟做錯了什麼?考慮到Player包含作爲類成員的地圖,指針和參考(銀行是參考)。一個簡單的賦值是否足以進行初始化?實現基於生長出來的以前的問題的問題向量

我該怎麼辦?

class Player 
{ 
public: 
Player(int,int,string, Bank&); 
Player(const Player&); 
Player& operator = (const Player& rhs); 


Player::Player(const Player& otherPlayer) 
{ 
ID = otherPlayer.ID; 
pName = otherPlayer.pName; 
pMoney = otherPlayer.pMoney; 
doubleIndicator = otherPlayer.doubleIndicator; 
position = otherPlayer.position; 
bank = otherPlayer.bank; 
colBought = otherPlayer.colBought; 
housesColBuilt = otherPlayer.housesColBuilt; 

} 

更新: 我在操作的implementantion點得到一個警告=爲:「返回一個局部變量或臨時的地址」。這是否喚起真正的問題?如果是這樣,我怎麼修改它來克服?

Player& Player::operator=(const Player& rhs) 
{ 
return Player(rhs); 
} 

這樣,我還是收到一條警告,遞歸函數會導致堆棧溢出:

Player& Player::operator=(const Player& rhs) 
{ 
*this = Player(rhs); 
return *this; 
} 

任何提示?

+0

回覆:更新。是的,這是一個真正的問題。 1)你不執行任何任務。 2)您返回對無效對象的引用。 (如果您認爲它有其他目的,則返回值僅用於鏈接。) – UncleBens 2011-12-25 14:51:51

+0

我需要什麼樣的分配?爲什麼我需要複製構造函數?無法在operator =的函數內執行所有的操作嗎? – arjacsoh 2011-12-25 14:57:27

回答

3

您必須初始化與在構造一個成員初始化類的成員引用:

Player::Player(const Player& otherPlayer) : 
    bank(otherPlayer.bank) 
{ 
    //... 
} 

這是必要的,因爲否則的引用將未初始化,這是不允許的。

注意分配bank = otherPlayer.bank;就不一樣了:它指定所引用的,而不是設定基準的對象本身。

它也是良好的作風來初始化其他成員(即使他們不是引用)以同樣的方式,因爲它可以導致更優化的代碼(否則成員可能是默認構造被分配之前)。

+0

其他所有可以用同樣的方法初始化。 – Mat 2011-12-25 14:11:04