如何在C ++的命名空间中将类设为私有?

Dan*_*tos 2 c++ namespaces private

如何在C ++中的名称空间内部将类设为私有,并防止其他人从名称空间外部访问该类,例如:

namespace company{
    class MyPublicClass{ ... }  // This should be accessible 
    class MyPrivateClass{ ... } // This should NOT be accessible
}
Run Code Online (Sandbox Code Playgroud)

rah*_*ma1 7

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

例如,我们有一个名为的文件source1.cpp

//source1.cpp
namespace company{
    class MyPublicClass{ ... };
    namespace{
        class MyPrivateClass{ ... };
    }
}
void f1(){
company::MyPrivateClass m;
}
Run Code Online (Sandbox Code Playgroud)

MyPublicClass有外部联系,MyPrivateClass也有内部联系。因此,这没有问题,source1可以将其编译为库,但是如果我们还有其他名为source2.cpp

//source2.cpp
void f2(){
company::MyPrivateClass m;
}
Run Code Online (Sandbox Code Playgroud)

source2无法与已编译的链接,因此source1我们无法引用MyPrivateClass


Som*_*ude 6

您不能使用名称空间的访问说明符,但是可以使用类的访问说明符:

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

public:
    class MyPublicClass { ... };
};
Run Code Online (Sandbox Code Playgroud)

您可以使用范围运算符访问类,就像访问名称空间一样:

company::MyPublicClass my_public_object;
Run Code Online (Sandbox Code Playgroud)

如果“公共”类应有权访问“私有”类,则“私有”类必须是friend“公共”类的。


还有另一种方法,那就是MyPrivateClass在公共头文件中根本不包含定义。在源文件中定义类,或者在内部仅包含的私有头文件中定义类。

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

  • 如果您想在别处添加到命名空间,那么就会分崩离析。由于您不能“合并”多个类定义,就像多个命名空间定义组合一样, (2认同)

πάν*_*ῥεῖ 6

你不能。

C ++名称空间不提供任何作用域访问器,也不提供类声明(例如,VS C#)。

通常的方法是引入一个internal名称空间以指示public不希望使用。

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

您还可以使用一些技巧来使公开访问接口变得更加困难,如此处所述:如何正确删除/重构“ friend”依赖项声明?