如何在C++中使类在名称空间内私有
How make a class private inside a namespace in C++?
如何在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»依赖声明?
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级