c++ - 命名空间级访问

标签 c++ namespaces access-modifiers

我有以下情况:

namespace MyFramework {
  class A {
    void some_function_I_want_B_to_use() {}
  };
  class B {
    B() {
      some_function_I_want_B_to_use() {}
    }
  };
}

我希望 some_function_I_want_B_to_useMyFramework 命名空间之外不可见,但我确实希望它对 MyFramework 内部的任何人可见(或者,对只是 B 类也可以)。我有很多这样的方法,是从 MyFramework 的公共(public) API 中隐藏它们以使 MyFramework 中的所有类成为 friend 的唯一方法吗?我也在考虑将所有“低级”类放在 B 中,但我不想走那条路,直到我确定它能够实现从 B 内部而不是从 B 内部访问 A 的所有方法的能力在 MyFramework 之外。

重申一下,我有一个全部在同一个命名空间内创建的框架,并且每个类都有对使用该框架的公众有用的方法。然而,每个类也有一些方法使公共(public) API 复杂化,但框架正常运行需要这些方法。

最佳答案

I want the some_function_I_want_B_to_use to not be visible outside of the MyFramework namespace, but I do want it to be visible to anyone inside of MyFramework.

总之,您需要类似于 Java 中的包的东西。

不幸的是,对于命名空间,这是不可能的。命名空间中包含的每个类都可以从命名空间的外部访问:命名空间是开放的。

解决方案通常是为实现细节添加另一个命名空间:

namespace MyFramework
{
    // Implementation details
    // Should not be used by the user
    namespace detail
    {
        class A
        {
            public:
                void func();
        };
    }

    class B
    {
        public:
            B()
            {
                A a;
                a.func();
            }
    };
}

不要忘记添加注释,说明用户不使用 detail 命名空间。

关于c++ - 命名空间级访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511959/

相关文章:

c++11 struct初始化编译错误

c++ - VS2015 : LNK2019 error when linking with Muiload. 库

vb.net - 私有(private)子、函数和类之间的区别

c# - 为什么我们不能在 C# 中重写方法时更改访问修饰符?

c++ - 从 MinGW .a 转换为 VC++ .lib

C++ Sprite 不显示 - 也没有错误

c# - 如何解决 BlazorServer 默认项目解决方案中的命名空间错误(VisualStudio 代码)

xml - XQuery:省略不包含 namespace 的源文档的 namespace

c++ - 命名空间菜鸟问题 : two cpp files sharing the same namespace have the same variable

intellij-idea - 如何在 IntelliJ IDEA 中显示类的访问修饰符?