2010-07-13 75 views
5

有沒有一種方法可以檢測到(例如編譯器警告)如果類聲明爲friend但不訪問私有成員,即。當友誼毫無用處?C++中未使用的朋友類

+1

也許你可以使用Clang庫粘貼一個程序? – 2010-07-13 13:38:49

回答

3

編譯器警告不是標準化的,所以這取決於您的特定編譯器。但是,如果他們中的任何一位支持這一點,我會感到非常驚訝。如果你有一個只有其他公共成員調用的公共成員函數(這意味着它不需要公開),那麼類似的情況就是如此,並且我不認爲任何編譯器都會檢測到這一點。

做這些測試中的任何一個都會給編譯器編寫者帶來額外的工作,我懷疑他們是否會認爲它們足夠有用以實現。

+1

我不太瞭解你的公共成員的例子,但否則我同意你的答案。 – 2010-07-13 13:55:05

+0

@Helltone:我猜他是說如果一個公共成員函數只能通過同一個類的其他函數來訪問,那麼它就不需要公開。 – casablanca 2010-07-13 15:38:11

2

不是我所知道的。也許有一個可以做到的重構工具。你總是可以嘗試消除友誼,看看它是否仍然編譯,但這對於一個大型項目來說可能是耗時的。

6

我不知道如何來檢測這個使用編譯器警告,但這樣做會去你的類定義文件的另一種方式,做一個搜索&與/*friend*/ class替換爲friend class,看看它是否仍然編譯。當然,這對於一個大型項目來說可能會很乏味。

+1

這會導致語義上相當複雜的變化。在這裏的評論中很難解釋,但名稱查找基本不同。 – MSalters 2010-07-13 14:22:13

+1

@ MSalters:你有鏈接,我可以在哪裏閱讀?我很想知道語義的變化是什麼。 – Praetorian 2010-07-13 17:07:08

0

您可以編譯代碼以查看它是否編譯,然後刪除所有'朋友'聲明(可能以編程方式使用sed)並查看它是否仍然編譯。

+2

以下宏是一種將'朋友'(以及該行代碼的其餘部分)轉換爲註釋的簡單方法。如果朋友聲明是多行的,這將不起作用。 #define朋友// – 2010-07-13 23:41:14