2017-02-02 25 views
3

我曾經將我的測試類命名爲待測試類中的朋友,以便啓用測試專用字段。我注意到這個班的名字沒有經過驗證。這是故意嗎?爲什麼「朋友班」沒有被驗證存在?

+3

*「我曾經爲了測試私人領域而將我的測試班作爲朋友在課堂上進行測試。」* - 這是一個可怕的想法。測試不能破壞封裝。 –

+3

聲明*創建*名稱。他們不檢查名稱的存在。 –

+0

你能舉一個你有什麼樣的例子,你認爲哪一部分不應該工作? – NathanOliver

回答

2

一個朋友類聲明一個使用詳細類型說明符不合格該類的名稱實際上是該類的聲明。它引入了該類作爲封閉名稱空間的成員。它不要求它預先宣佈

class C 
{ 
    friend class X; // OK, introduces '::X' 
}; 

但是,如果你在一個朋友類聲明中使用合格的名字,它會受到正規合格的名稱查找。它必須引用先前聲明的名稱

class X {}; 

class C 
{ 
    friend ::X; // OK, refers to '::X' 
    friend ::Y; // Error, no '::Y' in sight 
}; 

所以,如果你想成爲「驗證其存在」的類名,在朋友的聲明使用合格的名稱。

1

這是故意嗎?

我這麼認爲。這很像前向聲明。

通常friend類需要友好類的完整聲明,但反之亦然。


要強制檢查的存在(聲明)類型可以使用

class MyClass { 
    friend FriendClass; 
}; 

@bogdan's comment提及。


作爲一個方面說明:
如何重構大多不恰當的朋友模式,我建議你閱讀我的Q &一個帖子:How can I remove refactor a «friend» dependency declaration properly?

+3

你可以說'朋友X;'而不是'朋友類X',然後它需要先前的聲明。也許這會幫助OP。 – bogdan

+0

@bogdan有趣的。我沒有意識到這種語法的微妙之處。 –

+0

如果我正在閱讀標準的權利(** [dcl.type.elab] **),這是因爲聲明工作由'class'完成,而'friend'只是一個修飾符。稍後在** [class.friend] **註釋11中提到了一些關於我在我的腦海中進行的範圍的警告。 – user4581301

0

想象一下,是否需要朋友類存在。你將如何構建你的代碼?爲了測試你的代碼中有你的朋友聲明。當你建立你的發貨版本時,你不會發布測試代碼,所以你必須刪除好友聲明並重建所有東西。現在您的代碼與您測試的代碼不同。

+0

查看bogdan和AnT的回覆。否則我不會堅持朋友。在開發階段,調試/發佈解決方案也可以做。像斷言。 – katang

相關問題