2016-08-05 144 views
0

如何使一个类私有C++中的命名空间内,防止他人从空间外面访问类,例如:如何让一个类在C++的命名空间内是私有的?

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

把它放在一个私人头文件? –

+2

我认为命名空间不能这样做。也许你想要的是C++模块。或者只是使用嵌套类。 –

回答

4

你不能有命名空间访问说明,但您可以

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

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

您访问类,就像用范围操作符命名空间:

company::MyPublicClass my_public_object; 

如果“公共”类应该可以访问“私人”类,那么“私人”类必须是“公共”类的friend


也有另一种方式,那就是根本没有在公共头文件中定义MyPrivateClass。要么在源文件中定义类,要么仅在内部包含私有头文件。

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

+1

如果您想添加到其他位置的名称空间,则会崩溃。由于不能“合并”多个类定义,就像多个名称空间定义合并一样, – nate

+0

@nate如果你想让一个类对命名空间是私有的,那么机会就是限制它的使用,以便将它填充到类定义可能不会对可用性产生重大影响(此处不在此意图范围之内)。 –

+0

@CaptainObvlious这很可能,我只是指出了这种方法的潜在缺陷。过去我采用这种方法来允许我在“命名空间”上专门化模板。 – nate

4

你不能。

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

通常的方法是引入一个internal名称空间来指示public的用法不是意图。

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

你也可以使用一些技巧,使其更难访问公开喜欢这里解释的接口:How can I remove/refactor a «friend» dependency declaration properly?

3

您可以使用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

+1

在多个模块中存在重复的类和方法名称的问题(每个模块中具有相同名称和相同方法但未在头中声明的类,因此没有外部可见性;链接器会自动删除除一个实现之外的所有内容),并且您的提示可解决此问题。谢谢! –

+0

很高兴帮助! – rahnema1

相关问题