如何在 C++ 的命名空间内使 class 私有?

How make a class private inside a namespace in C++?

如何在 C++ 的命名空间内使 class 私有并防止其他人从命名空间外部访问 class,例如:

namespace company{
    class MyPublicClass{ ... }  // This should be accessible 
    class MyPrivateClass{ ... } // This should NOT be accessible
}

您不能为命名空间设置访问说明符,但可以为 classes:

class company {
    // Private (default)
    class MyPrivateClass { ... };

public:
    class MyPublicClass { ... };
};

您访问 classes 就像使用范围运算符的命名空间一样:

company::MyPublicClass my_public_object;

如果 "public" class 应该可以访问 "private" class,那么 "private" class 必须是 friend 的`public" class.


还有一种方法,就是在public头文件中不包含MyPrivateClass定义。在源文件中定义 class,或者在仅包含在内部的私有头文件中定义。

选择哪种方式取决于您的设计和用例。

你不能。

C++ 命名空间不提供任何作用域访问器,class 声明也不提供(例如与 C# 相比)。

通常的方法是引入一个 internal 命名空间来指示 public 不打算使用。

您可以使用 friend 说明符限制访问。

您还可以使用一些技巧,使公开访问界面变得更加困难,如下所述:How can I remove/refactor a «friend» dependency declaration properly?

您可以使用 unnamed namespace。出现在未命名空间中的名称具有内部链接,但出现在命名空间中且没有任何存储 class 说明符的名称默认情况下具有外部链接。

例如我们有一个名为 source1.cpp:

的文件
//source1.cpp
namespace company{
    class MyPublicClass{ ... };
    namespace{
        class MyPrivateClass{ ... };
    }
}
void f1(){
company::MyPrivateClass m;
}

MyPublicClass 有外部链接,MyPrivateClass 有内部链接。所以 source1 没有问题,它可以编译为库,但是如果我们有其他文件名为 source2.cpp:

//source2.cpp
void f2(){
company::MyPrivateClass m;
}

source2 无法与编译后的 source1 链接,也无法引用 MyPrivateClass.