2016-03-02 8 views
0

我有一個賦值,我們應該使用父/子類重載操作符,並且我想將父對象轉換爲子對象。所以像船+飛機=水上飛機。將父對象轉換爲C++中的子對象,並使用重載的操作符

一個實施的例子:

seaPlane plane::operator+=(boat rhs) 
{ 
    seaPlane temp; 

    temp.displacement = rhs.displacement; 
    // etc... 
    *this = temp; 
    return *this; 
} 

我得到兩個錯誤的位置:它說船數據成員不可訪問,並且「沒有合適的用戶定義的轉換......存在」。

知道我將這些對象存儲在異構集合中可能也很有用。

+1

您確定需要重載+ =運算符而不僅僅是+嗎?順便說一句,如果這些車輛有一個共同的基類,那麼你可能能夠使用一個更簡單的容器爲您的收藏。 –

+0

如果我們超負荷+而不是+ =教練要讓我們保持一致。這是此練習的主要目的。另外,我的超載+中出現相同的(第一個)錯誤。此外,異構集合是使用繼承的主要原因之一。 – LoserName

+0

這對你的老師來說似乎是一件非常奇怪的事情,你已經發現了原因。你不能分配給'this'指針,因爲它是一個prvalue,並且不能被分配給(除非賦值被重新定義來做別的事情)。 + =運算符是爲了積累而不是重新定義的,所以這看起來像是它應該做的不好的操作。你能否給我們提供關於要求的更多信息?你應該逐字地發表,所以我們可以幫助解釋它們。 –

回答

0

對於你的第一個錯誤,這裏是你應該嘗試做的事情。檢查您的船班中您的成員變量的訪問權限。他們都是私人的還是保護的?如果是這樣,那麼你可以在節點類中聲明seaPlane類是一個朋友類。這應該給你訪問權限。

就是這樣。

class boat{ 
friend class plane; 
//some code 
} 

否則,您可以使成員變量公開以允許訪問。最好的選擇是基於你的實現和你想要的。

最後,正如你對問題的評論指出的那樣,它更容易超載+。

+0

感謝您的回覆。我不確定我們是否被允許使用朋友,所以我必須檢查。讓數據成員公開,肯定會對得分造成不利影響,因此不在場上。 – LoserName

0

不幸的是,我沒有評論Jonathan Smit的回答所需的聲望。

我同意,船的數據成員的訪問級別是一個問題,但由於實行+ =(或者,如果你遵循其他建議+)在類飛機,你需要有

class boat{ 
    friend class plane; 
    // class definition as before 
}; 

對不起,這是一個自己的答案,我覺得它最好作爲一個評論。

+0

嘿,你的回答是正確的。我補充說這個改變。感謝您指出! :) – 2016-03-02 17:42:44

相關問題