2013-03-06 67 views
1

我的問題是純粹的組織性質,因此我認識到潛在的答案可能是主觀性的。經過多年與C#的合作,我終於回到了C++,並且習慣於如何正確組織文件。我在哪裏定義謂詞和函數對象?

基本上,我想知道哪裏最好的地方是定義謂詞和函數對象。目前,我在一個類中爲STL算法使用了一個簡單的函數對象。這個函數對象對其他類不會有用,所以我把它放在哪裏?我是否將它放在相同的命名空間和頭文件或.cpp文件中?我把它放在一個匿名的命名空間中,還是放在它自己的頭文件/ cpp文件中?

預先感謝您的任何和所有的答案,

凱文

+1

在課堂本身呢? – Pubby 2013-03-06 20:03:29

回答

1

這真的取決於謂詞是什麼,如果它可能擁有的任何使用到最終用戶我會把它的聲明在標題中,理想的情況是作爲一個通過const ref獲取的自由函數,以及源文件中的實現。

如果它是程序的一部分(而不是庫),那麼我也只是爲了簡單起見也這樣做。

如果它嚴格用於內部使用,並且不希望最終用戶使用它,則可以將它放在源文件中的匿名名稱空間中。

+0

我明白了,這些準則很容易記住並遵循,謝謝你的回答。在這種情況下,將它放在源文件中的匿名名稱空間中可能是最合適的。我一直在使用C#很久以至於我簡單地忘記了如何正確組織C++代碼(缺少頭文件和所有這些)。 – 2013-03-07 12:02:40

1

我假設你不能使用C++ 11,否則我會建議使用lambda表達式儘可能;),但是,因爲我在這裏沒有很好的理由正是我平時做的:

如果我只在一個函數中使用謂詞我在函數中聲明它,如果我只在一個代碼文件中使用它,我把它放在anonymouse命名空間中。我喜歡保持.h文件儘可能乾淨,以減少重建和文件依賴性的數量。

我相信使用anonymouse命名空間或將它們放入函數有助於避免名稱衝突和結果更乾淨的代碼。

+0

這就是爲什麼在貼出這篇文章之前我傾向於源文件中的匿名命名空間。感謝您的幫助! – 2013-03-07 12:07:11

1

取決於謂詞的用法。既然你說它在其他地方沒有用,最好在你的cpp文件中聲明它,以免在人們包含你的頭文件時混亂命名空間。

如果在文件範圍內甚至沒有用處,那麼如果它不太複雜,可以考慮使用lambdas。如果您無法訪問C++ 11的lambda(或Boost.Lambda),則可以在函數範圍內聲明本地函子。這非常方便!但是,請記住,您不能在文件範圍級別使用模板化的函子,這通常是您想要的,但是(這裏的示例將使用'模板化迭代器')。

+0

好的,.cpp是。我知道如何使用lambdas(畢竟C#有它們),但我不知道它已經被合併到C++中了!我必須一定要研究這一點,因爲我創建的大多數應用程序只需要簡單的,非模板化的函數,所以lambda是理想的。感謝您的幫助。 – 2013-03-07 12:04:47

1

如果它的意思是由一類只用了,你不要指望它是其他任何人,這聽起來像正是時候了嵌套類有用:

class SomeClass { 
public: 
    //... 

    struct MyPredicate { 
     bool operator() (const SomeData&) const; 
    }; 

}; 

實際名稱上面的類是SomeClass::MyPredicate,所以如果operator()未在其聲明中定義,則需要在某處定義SomeClass::MyPredicate::operator()。但在SomeClass的任何成員內部,您只需鍵入MyPredicate

您也可以使謂詞成爲它的包含類的成員,在這種情況下,甚至不允許外部代碼輸入該類的名稱。

+0

有道理,我也會嘗試這種方法,看看在我的情況下哪一種看起來最自然。 – 2013-03-07 12:05:28