2010-04-20 49 views
4

我在問C++項目中廣泛使用的最佳實踐。我需要在項目中擁有自己的類型。它是一對typedef的集合。命名空間與頭文件

是否包含包含C++類型良好實踐的頭文件,還是使用命名空間更好。如果是這樣,爲什麼?這兩種方式有什麼優點和缺點?

現在它看起來是這樣的:

types.h中:

#ifndef TYPES_H 
#define TYPES_H 

#include <list> 

// forward declaration 
class Class; 

typedef int TInt; 
// ... 
typedef std::list<Class> class_list; 

#endif 

class.h:

#ifndef CLASS_H 
#define CLASS_H 

#include "types.h" 

class Class 
{ 
    public: 
     // ... 

     TInt getMethod(); 
    private: 
     // ... 
}; 

它是如何將看起來像命名空間?

回答

4

從一個依賴點,命名在所有類型一個頭可能是一個維護噩夢。 typedef是可以理解的,因爲你需要一個唯一的定義,但是沒有理由在這裏宣佈class

// types.h 

namespace myproject 
{ 
    typedef int TInt; 
} // namespace myproject 

有正向聲明Class符號沒有一點:你污染你自己的命名空間。讓每個文件獨立決定是否需要該符號,然後轉發自行聲明。

聲明ClassList也不好:它應該只適用於需要它的人。你可以創建一個特定的頭文件,用於向前申報Class相關內容:

// class_fwd.h 

namespace myproject 
{ 
    class Class; 
    typedef std::list<Class> ClassList; 
} // namespace myproject 


// class.h 

#include "myproject/class_fwd.h" 

namespace myproject 
{ 
    class Class {}; 
} // namespace myproject 
1

呃...我認爲包括頭文件是好的。我不確定命名空間是如何攻擊這個相同的問題的......

像這樣的任何「最佳實踐」的主要事情是一致的。

10

這兩個概念是正交的;比較他們的方式你沒有任何意義。

除非您只在單個文件中使用這些類型,否則必須將它們放在標題中,以便在需要時可以輕鬆引入它們的定義。然後,頭中,你可以包括你的命名空間:

#ifndef TYPES_H 
#define TYPES_H 

#include <list> 

namespace MyNamespace { 
    // forward declaration 
    class Class; 

    typedef int TInt; 
    // ... 
    typedef std::list<Class> class_list; 
} 

#endif 

再後來,你可以做,例如,MyNamespace::TInt而不是int後你#include "Types.h"