2013-02-14 95 views
6

這可能不是特定於C++的問題,更多的是面向對象編程。我對此很陌生,我對我的設計感到懷疑。我有一個類解析器,基本上實現了許多處理解析表達式,從中綴到後綴等的函數。我在這些主函數中使用這些解析器函數。我意識到我不需要這個類的任何數據成員。因此,我並不需要這個類的對象。因此,我最終讓每個功能在課堂上都是靜態的。這個設計有什麼奇怪的地方嗎?我應該把它作爲一個接口嗎?有什麼建議麼?C++中沒有數據成員的類

+6

一般來說,在C++中,可以在命名空間中放置非成員函數。沒有必要爲這樣的功能分組。 – juanchopanza 2013-02-14 23:57:30

+1

如果你只有一個解析器,命名空間就可以。如果你有Parser1和Parser2並希望能夠使用任何一種,這種設計是一種明智的做法。 – 2013-02-15 00:00:15

+0

爲什麼不在這種情況下兩個不同的名稱空間? – user592748 2013-02-15 00:02:29

回答

6
  1. 你想要一個解析器,你知道你想讓它做什麼你 - 這是有效的,你的「界面」。

  2. 您的當前實現的解析器不需要任何成員變量 - 因此,要實現您的接口,您不需要類。所以是的,取消你的靜態方法。像Kevin說的那樣,使用帶有普通舊功能(非靜態)的命名空間是一個好主意。

  3. 如果您覺得您需要添加一個需要維護內部狀態的新解析器,那麼您可能需要在(1)中定義一個接口 - 一個普通的舊公開可見頭文件,其中包含函數聲明你選擇的就足夠了。

+0

謝謝。這清除了它。大拇指澄清界面的含義並解釋如何處理第二種情況。 – user592748 2013-02-15 00:30:27

+0

不客氣。樂意效勞。 – Carl 2013-02-15 00:31:03

+0

無法自動從父對象的構造函數中調用靜態方法。 – peterh 2016-06-15 17:08:33

6

一個只有靜態函數的類看起來與我的命名空間相當不易區分。那麼,爲什麼不使用命名空間呢?

+0

不知道這是多麼的重要,但是你不能模擬一個命名空間(在我所知道的模擬框架中)。 – 2013-10-02 22:07:06

+0

不,沒有數據成員_can_的類有一個構造函數。 – peterh 2016-06-15 17:04:34

+1

構造函數並不令人感興趣,因爲這與另一個靜態函數沒有什麼不同。析構函數可能很有趣,但一個有趣的析構函數可能需要至少一個布爾數據成員來記錄該類是否已被移動(因此析構函數是否不應該做它將要做的有趣事情)。 – 2016-06-17 01:29:15

0

使用實用函數是靜態的,這是很常見的,所以,如果Parser類的函數不依賴於其他類,那麼您完全可以使它們成爲靜態的。如果他們互相依賴,並有可能的是,同樣的功能可以做的另一種方式,你應該考慮使用一個接口

1

決定這個問題的方法是如何使用函數?

1)如果所有函數都在一個文件中使用,並且不需要導出到任何地方,那麼一定要使用靜態函數。爲什麼?因爲只需將它們直接鍵入到.cpp文件中的類的主體中,並且不必擔心維護聲明和保持參數對齊。因爲當解析C++類時,所有在類體內定義的函數內部的所有代碼都會被跳過,然後在聲明瞭所有類成員後解析,因此這些函數都可以看到對方,並且名稱更好。編譯器如果你直接在類中聲明它們,也會嵌入很多較小的函數。

2)如果函數需要從當前.cpp文件外部使用,則使用普通函數。因爲以後他們可以在其他地方使用,並通過名稱導出它們更容易。