我可以在C++类中声明"using namespace"吗?

19

假设有一个C++类,而且有一个命名空间应该只在我的类内可见。怎么做?

class SomeClass
{
    using namespace SomeSpace;

public:
    void Method1();
    void Method2();
    void Method3();
};

namespace SomeSpace
{
    /*some code*/
};

1
你所说的“visible”具体指什么?命名空间不是像private/public那样的东西。 - KillianDS
一个选项是将类放在命名空间内。如果它如此依赖于该命名空间,为什么要放在外面呢? - Bo Persson
可能是为什么不能在类声明内部放置“using”声明?的重复问题。 - underscore_d
2个回答

11

using namespace X;是一个称为using指令的语法,它只能在命名空间和函数作用域中出现,而不能在类作用域中出现。因此,在C++中你想做的事情是不可能的。最好的办法是在该类所在的命名空间范围内编写using指令,但这可能不是理想的选择。

然而,经过分析您的话,

假设有一个C++类。并且有一个命名空间应该只在我的类中可见。如何处理?

我建议尝试以下代码,不确定是否符合您的要求。

class A
{
public:
    void Method1();
    void Method2();
    void Method3();
 
private:
 
    class B
    {
       //public static functions here, instead of namespace-scope
       // freestanding functions.
       //these functions will be accessible from class A(and its friends, if any) 
       //because B is private to A
    };

};

嵌套类看起来非常方便,因此很容易被吸引。然而,嵌套类的主要缺点(我认为这一点并没有得到充分报道)是,与任何其他类成员一样,所有嵌套类成员都可以完全访问封装类的所有私有/受保护成员。对于那些并非特别需要和使用嵌套类的情况(也许是大多数情况),它们基本上完全破坏了封装性。 - underscore_d

1

不过你可以这样做:

namespace SomeSpace
{
    /*some code*/
};

using namespace SomeSpace;

class SomeClass
{

public:
    void Method1();
    void Method2();
    void Method3();
};

虽然在头文件中使用using namespace指令并经常被认为是一种不好的风格,但并不建议这样做。将其放置在类的源文件(.cpp)中是可以的。


我没有看到你在类中如何使用 "using namespace SomeSpace;" 引入命名空间。 - mikanim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接