如何使一个类私有C++中的命名空间内,防止他人从空间外面访问类,例如:如何让一个类在C++的命名空间内是私有的?
namespace company{
class MyPublicClass{ ... } // This should be accessible
class MyPrivateClass{ ... } // This should NOT be accessible
}
如何使一个类私有C++中的命名空间内,防止他人从空间外面访问类,例如:如何让一个类在C++的命名空间内是私有的?
namespace company{
class MyPublicClass{ ... } // This should be accessible
class MyPrivateClass{ ... } // This should NOT be accessible
}
你不能有命名空间访问说明,但您可以类:
class company {
// Private (default)
class MyPrivateClass { ... };
public:
class MyPublicClass { ... };
};
您访问类,就像用范围操作符命名空间:
company::MyPublicClass my_public_object;
如果“公共”类应该可以访问“私人”类,那么“私人”类必须是“公共”类的friend
。
也有另一种方式,那就是根本没有在公共头文件中定义MyPrivateClass
。要么在源文件中定义类,要么仅在内部包含私有头文件。
选择哪种方式取决于您的设计和使用案例。
你不能。
C++名称空间不提供任何作用域访问器,也不提供类声明(例如vs C#)。
通常的方法是引入一个internal
名称空间来指示public
的用法不是意图。
您可以使用friend
说明符限制访问。
你也可以使用一些技巧,使其更难访问公开喜欢这里解释的接口:How can I remove/refactor a «friend» dependency declaration properly?
您可以使用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
。
在多个模块中存在重复的类和方法名称的问题(每个模块中具有相同名称和相同方法但未在头中声明的类,因此没有外部可见性;链接器会自动删除除一个实现之外的所有内容),并且您的提示可解决此问题。谢谢! –
很高兴帮助! – rahnema1
把它放在一个私人头文件? –
我认为命名空间不能这样做。也许你想要的是C++模块。或者只是使用嵌套类。 –