簡體   English   中英

為vector的擦除功能實現一個復制構造函數

[英]Implement a copy constructor for the erase function of vector

基於先前問題產生的問題: 帶有指針成員的vector :: erase, 在循環內刪除向量的元素 ,我仍然需要一些關於vector.erase函數的幫助。 有人指示我實現一個復制構造函數,以使擦除函數在矢量上起作用,在另一個問題中也提到了這一點。 在我的相關類中實現函數運算符至關重要。 在執行此操作時,我在創建復制構造函數時遇到另一個錯誤,並且我找不到很長的原因。 錯誤是“ Player :: Player(const Player&otherPlayer)不為以下提供初始化程序”。 我究竟做錯了什么? 考慮到Player包含作為類成員的map,指針和一個引用(bank是一個引用)。 簡單的分配是否足以進行初始化?

我該怎么辦?

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;

}

更新:在操作符=的實現點,我收到一條警告:“返回本地變量或臨時地址”。 這會引起一個真正的問題嗎? 如果是這樣,我如何修改它以克服這一問題?

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

這樣,我仍然收到警告,提示遞歸函數將導致堆棧溢出:

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

有什么提示嗎?

您必須使用構造函數中的成員初始化程序來初始化屬於類成員的引用:

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

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

注意,分配bank = otherPlayer.bank; 做了一些不同的事情:它分配被引用的對象,而不是設置引用本身。

以相同的方式初始化其他成員(即使它們不是引用)也是一種好的樣式,因為它可以導致更優化的代碼(否則,可以在分配成員之前對它們進行默認構造)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM