【问题标题】:C++ How do I make a function/variable local to a namespace?C++ 如何使函数/变量成为命名空间的本地变量?
【发布时间】:2017-01-21 22:35:07
【问题描述】:

我想简洁地声明一个命名空间本地的函数和变量,所以只有命名空间成员可以访问它们。

在 lua 中,我会使用“local”关键字来执行此操作(在文件/函数中)。在 C++ 中有什么相关的可能吗?

编辑

这是我的代码的伪 C++ 示例:

namespace wld {
    const int wldDivis = 4;
    void myFunc(){
        // wldDivis constant used here
    }
    void myFunc2(){
        // wldDivis also used here
    }
}

// Somewhere later
wld::myFunc();
wld::myFunc2();

变量“wldDivis”只在命名空间 wld 中使用过。如果其他人可能会破坏我函数的内部工作,我如何将其本地化/“使其不可见”到外部命名空间 wld,作为“强制不透明”?命名空间是否适合?

IE 不能在命名空间之外访问

【问题讨论】:

  • 也许static关键字就是你想要的,或者匿名命名空间
  • “命名空间本地”。没有这样的事情。无论如何,这将是无用的,因为命名空间是开放的。您始终可以将自己的函数添加到任何命名空间。

标签: c++ namespaces local


【解决方案1】:

在命名空间中声明的变量可以使用限定符从外部访问(mynamespace::myvariable)。例如,这是您可以访问 std::cout 的方式。

可以通过publicprivateprotected关键字在类内控制访问。

一个可能的(也是笨拙的)解决方法是将您的“全局变量”放在具有私有访问权限的类中,然后将该类与命名空间中的其他类和函数成为朋友。维护这不仅是一场噩梦,而且如果不是来自朋友,也将无法访问这些全局变量。

另一方面,巧妙地声明您的函数(因此它们对命名空间中定义的类进行操作并仅执行相关功能)将立即解决问题:一切都可以访问,因为它需要如此。

当然,周围有更多经验丰富的编码人员,所以也许有人可以利用文件级别的可见性、“extern”关键字等(我记得这些是旧 C 语言中的东西)。无论如何,您是否可以向我们提供您的代码示例,以便更好地了解该主题?

【讨论】:

  • 回复:“可以通过 public、private 和 protected 关键字在类内控制可见性。” - 不。 访问可见性是两个不同的东西。关键字public等控制访问。私人名称仍然可见
  • @PeteBecker 是的,绝对正确。很抱歉造成混乱,但英语不是我的母语,事情往往会变得混乱。将立即编辑。
【解决方案2】:

AFAIK 在 C++ 的命名空间中没有访问限制。

namespace foo {
    void local_func() {}

    // local_func can be accessed inside the namespace

    void global_func() { local_func(); }
}

// ...

foo::local_func(); // local_func can be accessed outside the namespace

您可以通过类定义中的静态成员函数实现一些接近的目标:

class foo {
    private:
        static void local_func() {}

    public:
        // local_func can be accessed inside the "namespace" of the class

        void global_func() { local_func(); }
};

// ...

foo::local_func(); // error : local_func is private to the class

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2013-04-26
    • 2014-07-20
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多