【问题标题】:Using namespace header file c++使用命名空间头文件 C++
【发布时间】:2015-08-05 13:13:54
【问题描述】:

我正在尝试在我正在编写的一些代码中获得良好的结构,但我不太确定头文件。我遇到的问题之一是:我知道我不应该在头文件中包含命名空间,但我不知道该放在哪里。

考虑这个标题:

// deck.h
#pragma once
#include <vector>
#include "card.h"

using namespace std;

typedef vector<card> pile;

class deck{
public:
    deck();
    ~deck();
    void shuffle();
    card takeCard();
    int getSize();
private:
    pile cDeck;
};

card.h 中的代码是卡片结构的定义。 typedef 甚至应该在头文件中吗?如果是这样,我该如何避免使用 std::vector?

任何提示都会被应用。

【问题讨论】:

  • using namespace std; 在头文件中是一个非常糟糕的主意!
  • 你不应该避开#include &lt;vector&gt;std::vector,你只需要避开using namespace std;。 (另外,如果 pile 类型在类内部,这似乎是个好主意,那么 typedef 应该在类的私有部分中。)
  • using std::vector 是这里的超级更好的选择!

标签: c++ header namespaces


【解决方案1】:

Using 和 using 命名空间可以在您的实现中的函数中使用。如果您想如上所述限制可能的冲突,并且您确实需要使用“using”或“using namespace”,请将其保留在小函数中。

【讨论】:

    【解决方案2】:

    你根本没有把它说出来。使用std::vector 而不是vector,只需要输入5 个额外的字符。 typedef 可以放在头文件中。

    您可能知道,标题中的using namespace std; 是错误的。为什么?因为所有将包含您的标题的文件都会自动use namespace std;,并且相对容易进入冲突名称,尤其是在客户可能不知道他/她隐式使用的using 指令的大型项目中。

    或者,您可以use namespace std;在标题中的内联函数定义

    inline void f()
    {
        using namespace std;
        cout << "bla" << endl;
    }
    

    或类,

    class Foo
    {
    using namespace std;
        // rest
    };
    

    这样,using 仅在其封闭范围内有效地“可见”。

    相关:What's the scope of the "using" declaration in C++?

    【讨论】:

    • 这个标题的 5 个字符是正确的,但我可以想象有更大的标题,实际上每次都输入它可能会很麻烦。因此,即使头文件更大,会大量使用某个命名空间,您仍然会使用 xxx::xx 吗?必须多次输入似乎是错误的。
    • @Dirklaren 实际上我只是在编辑。您可以在范围内use namespace std;,因此它不会“泄漏”到范围之外。
    • @Dirklaren:我们中的一些人每次都使用std::。这真的是很正常的事情。我唯一一次使用命名空间指令是使用长嵌套命名空间,例如boost::gregorian。即使这样,我也没有完全删除它,我只是想出了一个缩写(例如namespace dt = boost::gregorian;),并且在函数的范围内。
    • "所以即使头文件比较大,会大量使用某个命名空间,你还是会使用 xxx::xx?"“必须多次输入似乎是错误的。” 这真的只是我输入内容的一小部分。
    【解决方案3】:

    去掉using指令很简单,只需将代码重写为

    // deck.h
    #pragma once
    #include <vector>
    #include "card.h"
    
    typedef std::vector<card> pile;
    
    class deck{
    public:
        deck();
        ~deck();
        void shuffle();
        card takeCard();
        int getSize();
    private:
        pile cDeck;
    };
    

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多