[英]Namespaces vs. Header files
我問的是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:
// ...
};
如何使用命名空間?
這兩個概念是正交的; 比較它們你提出的方式毫無意義。
除非您只在單個文件中使用這些類型,否則必須將它們放在標題中,以便在需要時輕松引入它們的定義。 然后,在該標頭中,您可以包含您的命名空間:
#ifndef TYPES_H
#define TYPES_H
#include <list>
namespace MyNamespace {
// forward declaration
class Class;
typedef int TInt;
// ...
typedef std::list<Class> class_list;
}
#endif
然后你可以在#include "Types.h"
后執行MyNamespace::TInt
而不是int
從依賴性的角度來看,在單個頭中命名所有類型可能是維護的噩夢。 對於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
嗯...我認為包括頭文件很好。 我不確定命名空間如何攻擊同樣的問題......
像這樣的任何“最佳實踐”的主要內容是BE CONSISTENT。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.