2009-08-02 51 views
7

我試圖在以下最低綱領性示例中質疑我自己的代碼正確性,其中頭文件將標識符提升到當前名稱空間。命名空間的正確性

#include <string> 

namespace mine { 

    using std::string; // std::string lifted into mine 

    struct agent 
    { 
     string name; 
    }; 
} 

這是一個建議,我最近做的另一種替代使用的typedef:

#include <string> 

struct agent 
{ 
    private: 
     typedef std::string string; 
    public: 
     string name; 
}; 

我認爲第一種方案更正確的,因爲它使用我自己的命名空間,這是一個練習一個人應該習慣(命名空間創建和管理)。平均而言,由於標識符被提升到我控制的名稱空間內,因此這是一種安全的方法。

但是,我有第二個想法。例如,不小心使用命名空間,我的(例如using指令)也會將std :: string引入到視圖中。另一個問題是我暴露了std :: string太多。也許甚至到名稱空間的地區,這裏沒有必要或不需要。

在我看來,更正確的做法是始終在儘可能低的範圍內工作,並從那裏開始工作。只公開絕對必要的。我在第二個例子中使typedef是私人的事實正是因爲這個。但是,我沒有按照我自己的建議與第二個例子。

但在另一方面,我擔心的事實導致有人可能會濫用該命名空間

using namespace mine; 

乍看之下,我們知道這是不是一個命名空間的正確使用模式。但不可否認的是,有些情況下可能是可取的。你認爲第一種方法的有效性如何?

回答

8

我還以爲顯而易見的解決方案是:

namespace mine { 
    struct agent 
    { 
     std::string name; 
    }; 
} 

我個人並不在頭文件中使用的指令在所有使用。當然,在實現文件中。

+0

絕對!在任何情況下,這個例子都適用於那些作者有太多類型需要在課堂內聲明並希望簡化他們的輸入的情況。我覺得我對第一個例子給出了錯誤的建議。但是想要一些想法,因爲std :: string是相當無害的。 – 2009-08-02 18:27:13

+1

我想我不清楚你真的在問什麼。但我會注意到,在C++命名空間不是設計工具,所以如果你有很多命名空間問題,你可能有太多的命名空間。 – 2009-08-02 21:09:05

7

我通常這樣做:

// In header file: 

#include <string> 

namespace mine { 

    struct agent 
    { 
     std::string name; 
    }; 
} 

// In source file: 

using std::string; 

namespace mine { 
    // Code 
}  

這樣,你就不必在執行一次寫出來的std ::一遍又一遍,但你避免誰用你的頭無意中導入人的問題std :: symbols。

1

我經常這樣做:

// In header file 
#include <string> 
namespace mine 
{ 
    namespace detail 
    { 
     using std::string; 

     struct agent 
     { 
      string name; 
     } 
    } 

    using detail::agent; 
} 

這樣我就不必繼續鍵入在頭std::要麼,但有人仍然可以做using namespace mine;,而不是從std導入名。