2012-04-19 81 views
2

我有一個基類分數和派生類iFraction。分數表示不正確的分數,i分數表示混合分數。基類和派生類的朋友函數

class Fraction {...}; 
class iFraction : public Fraction {...}; 

現在,我想聲明這兩個類的朋友函數,即convertF。函數convertF可以將不正確的分數(分數)轉換爲混合分數(iFraction)。 我這樣做有多冷? 其實,我想聲明函數是這樣的:

friend iFraction convertF (Fraction &Fra); 

但是,它不能在基地CALSS分數內聲明。爲什麼?

回答

2

由於friend關係不會被繼承,所以您需要聲明convertF作爲這兩個類的朋友。但是隻有當函數需要訪問這些類的內部時,你才需要它 - 你確定這些類的公共接口是不夠的嗎?

試圖避免這種雙重朋友的另一個原因是它會通過convertF的簽名在這些類之間創建循環依賴關係。

更新:這正是爲什麼你不能以你上面顯示的方式聲明你的朋友功能。爲此,編譯器需要知道iFraction的完整定義,但仍未完成基類Fraction的定義,這是不可能的。

從技術上講,它可以通過前向聲明iFraction反過來工作。雖然我仍然不認爲這是一個好的解決方案。你確定你的班級結構是正確的嗎?

+0

感謝您的回答。現在,我明白爲什麼我不能這樣做。但是,我怎麼能實現我的目的,將分數轉換成iFraction – user1305904 2012-04-19 12:30:13

+0

類Fraction有兩個數據成員,一個用於分子,一個用於分母。類iFraction還有一個數據記憶iNum,它代表整數 – user1305904 2012-04-19 12:34:05

+0

@ user1305904的部分,在對術語進行雙重檢查之後,現在我確信您的繼承關係不正確:混合部分不是**是不正確的部分。當然,兩者之間的轉換是完全明智的。 – 2012-04-19 13:01:14

2

你不需要這個朋友的功能。有兩種方法可以使用dynamic_cast或編寫一個轉換構造函數,該構造函數接受Fraction對象並將其轉換爲iFraction對象。我不確定第二個選擇是否是一個好選擇,但是試試看。

+0

感謝您的回答。但是,我現在不知道什麼是dynamic_cast。我只是一個新手。 – user1305904 2012-04-19 12:56:35

+0

@ user1305904 - http://stackoverflow.com/questions/2253168/dynamic-cast-in-c – DumbCoder 2012-04-19 13:00:34