2012-10-04 50 views
12

當寫在C++的類的helper方法,它應該被聲明爲類的標頭中定義的私有方法(.h)文件中?例如:輔助函數是否應該放在頭文件或實現文件中?

/*Foo.h*/ 
class Foo { 

    public: 
     int bar(); 

    private: 
     int helper(); 
}; 
... 
/*Foo.cpp*/ 
... 
int foo::bar() { 
    int something = this->helper(); 
} 

int foo::helper() { 
    ... 
} 

或者,是它最好不要將其聲明爲類的私有成員,而不是僅僅使其在實現一個獨立的功能?

/*Foo.h*/ 
class Foo { 
    public: 
     int bar(); 
}; 
... 
/*Foo.cpp*/ 
... 
int Foo::bar() { 
    int something = helper(); 
    ... 
} 

int helper() { 
    ... 
} 

回答

18

在實現文件中一個獨立的功能,提高了封裝:它需要在頭沒有申報,所以沒有客戶端代碼重新編譯時,其無論出於何種原因簽名的變化。對我而言,這是一個很好的理由,只要可行就更喜歡這個選項。 (請務必把它的匿名命名空間,以防止在連接時識別衝突。)

然而,private方法通過this指針訪問一個類的實例其私處。如果需要這樣的訪問,那麼它必須是一個方法或friend。在這兩種情況下,它都會在類定義(頭文件)中可見,並且方法比朋友更方便。

+1

要擴大你的第二個段落:喜歡非朋友非成員函數(http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197)。如果一個功能不需要私人訪問,請不要私人訪問。 –

+0

@sftrabbit:謝謝。我稍微磨礪了第二段。 –

1

我的立場是,報頭包含儘可能少的廣告可以同時實現了預期的設計和佈局屬性。如果有一個選項進入源代碼。儘管如此,一些內部細節需要訪問一個類的太多內部細節,以使其能夠實施。

4

如果您的輔助函數有意義的是對象的方法,我幾乎總是喜歡以使其成員函數所以有一個隱含的this指針,而不是通過一個Foo *給助手功能。

如果幫助函數不需要是對象的一個​​方法(也就是說,它不需要訪問數據成員或其他成員函數),那麼使它成爲一個獨立的函數(static或匿名命名空間,最好)。

2

這是有點主觀的,我想。

在我看來,這取決於它是否有什麼關係類的成員,你和/或是否希望朋友類(在protected訪問的情況下或派生類)中使用它。

如果該功能實際上並沒有任何成員上運行的,而不是別人有興趣的話,你應該保持它在實現文件爲靜態函數。此外,如果這是一項必須快速的操作,您可以藉此機會製作它inline。相反,如果函數在類上運行,或者可能在派生類或相關類中具有額外用途,則使其成爲成員。

相關問題