簡體   English   中英

命名空間與頭文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM