如何在C++中使类在名称空间内私有

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

本文关键字:空间 C++      更新时间:2023-10-16

如何在C++中使类在命名空间内私有,并防止其他类从命名空间外访问该类,例如:

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

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

例如,我们有一个名为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

不能为命名空间指定访问说明符,但可以为:

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

访问类就像使用scope操作符访问命名空间一样:

company::MyPublicClass my_public_object;

如果"public"类应该有权访问"private"类,那么"private(私有("类必须是`public(公共(类的friend


还有另一种方法,那就是在公共头文件中不包含MyPrivateClass定义。可以在源文件中定义类,也可以在仅内部包含的专用头文件中定义。

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

您不能。

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

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

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

你也可以使用一些技巧,让它更难公开访问接口,就像这里解释的那样:我如何正确地删除/重构«friend»依赖声明?