2017-01-20 141 views
0

我在很多遺留代碼中看到以下模式。我不熟悉它,無法理解爲什麼它在那裏。奇怪的構造模式

在頭文件:

struct ook 
{ 
    bool func_called; // Not declared as const! 
    bool func(); 
    ook(); 
}; 

在源文件:

ook::ook(): 
    func_called(func()) 
    {} // ← Nothing there whatsoever. 

bool ook::func() 
{ 
    // … ← Some stuff without a "return" statement of any kind. 
    return true; // This does mean that func_called is always true. 
} 

這是一些有用的東西,或只是奇怪一些可怕的複製和粘貼錯誤?現在

func_called只調用構造函數並在代碼永遠不會別的。如果是的話,正如his answer中的Florian Castellane所指出的那樣,這是有道理的。如果它只發生一次,我可以想象這曾經被使用。然而,它在代碼庫中發生了幾十次,所以我想知道它可以使用的其他用途。

只是要格外清楚,這不是我的代碼。我只是想了解(並且沒有歷史,評論或單元測試)邏輯寫的是什麼。也許這是無望的?

+0

不知道它是否有名稱,但它遵循構造函數應爲空的概念。因此,不是讓代碼決定構造函數體中應該包含什麼'func_called',而是將該值賦給一個默認構造變量,然後將它們放入函數中,然後在構造該構件的成員初始化程序中直接調用該函數。我認爲這個功能需要是靜態的。 – NathanOliver

+3

@Nathan不一定是靜態的。 –

+0

@ PeterA.Schneider因此,在完全構造類之前調用​​非靜態函數是合法的? – NathanOliver

回答

4

假設代碼測試的用於true == func_called的其餘部分,這可用於確保使用構造被初始化的結構。

+0

公平點,但在代碼中從來沒有發生過。發生,不再有 - 歷史因粗心而被抹去☹ – Sardathrion

+0

這個func_called布爾值用於所有? –

+0

不,它的唯一用處似乎是在構造函數中,現在,如果它只有一次我可以解釋爲陳舊的代碼,但它發生了幾十次。 – Sardathrion

1

如果你的意思是真實的,沒有人使用ook::func_called,那麼你的代碼等同於以下簡單的代碼:

struct ook 
{ 
    ook() { func(); } 

    void func() { /* Some stuff */ } 
}; 

你應該注重是否拷貝構造和拷貝賦值表現爲意。

+0

'grep'似乎是這樣的...... – Sardathrion

+0

@Sardathrion:你的grep能否看到宏和行的延續?也許更好使用鏗鏘查詢。 –

+0

如果在RedHat上可用,我很樂意使用clang-query。不是這樣。至於'grep',我很確定它抓住了一切。 – Sardathrion