2011-06-01 39 views
4

有時候,像寫一行到控制檯的某些事情,感覺喜歡的事,應該是對所有對象全局訪問。例如:靜態函數是否可以接受C++中某些事情的實踐?

writeError("UNHANDLED EXCEPTION",someData); 

此外,像數學函數這樣的東西也有這種感覺。但是當你做這種事情變得糟糕時,你怎麼畫線?

+4

來自Java或C#,呃? – 2011-06-01 13:22:17

+0

靜態函數不是全局可訪問的。他們是翻譯單位的當地人。 – 2011-06-01 13:23:11

+0

@Tadeusz:這取決於你的意思是「靜態」。 – 2011-06-01 13:34:40

回答

10

有些人在非成員函數需要成爲它的一個參數friend的地方畫線,所以他們使用了很多免費函數。

有些人在畫點,其中非成員函數可以合理是它的一個參數的成員函數,即使它實際上並沒有使用類的內部線路。他們的免費功能較少。

它通常最好不要認爲這是「成爲壞習慣」 - 不是在C++所有的設計是「正確的」面向對象的。如果你的任務最好通過OOP以外的方式解決,那麼使用OOP本身就是「不好的做法」。關於如何最好地設計你的代碼的論點可以無限期地用任何語言繼續下去,但是C++並沒有做出任何特別的努力來指導你編寫類。

參見:

Effective C++ Item 23 Prefer non-member non-friend functions to member functions

+1

爲了說明OOP問題:類方法依賴於(隱式地)在類內部。但是,免費函數只能訪問類公共API。這減少了耦合/增強封裝:因此更容易改變類內部,聲明類不變量等等。 – 2011-06-01 14:08:05

6

全球這種性質的API是就好了。

這些天是包裝他們在一個命名空間中的最佳實踐:

namespace LOGGING { 
    void writeError(message, ...); 
} 

製作的東西在C++中的靜態是不一樣的事情使一些在Java靜態。在C++中,靜態函數只能從該編譯單元(.cpp文件)中看到。它並沒有使它成爲一個全球性的非類功能。然而,C++中的靜態成員函數在Java中是相同的 - 它允許從對象上下文class :: method(params)之外調用它,而不是classObject.method(params)。

1

這裏有兩個問題:

是靜態函數接受 做法在C某些事情++?

是的,有些東西只能使用功能存檔。例如,註冊到大量回調。

還有諸如數學函數 這樣的東西也有這種感覺。但是如何做 做這樣的事情 成爲不好的做法呢?

此外,在班運營商可以是函數(例如運營商+,取兩個操作數,或流運算符。 如何畫一條線?我猜做的不夠的壞事,以確定什麼是壞,什麼是不錯。取得經驗足夠的經驗,你就會知道。 我的建議是儘量充分單元測試你的代碼。有長期和複雜的單元測試,還是沒能容易單元測試的東西通常是一個問題的徵兆。

+0

+1趣味點 - 單元測試作爲良好設計的標準 – davka 2011-06-01 14:32:58

相關問題