2009-08-02 54 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导入名。