如何在 C++ 的命名空间内使 class 私有?
How make a class private inside a namespace in C++?
如何在 C++ 的命名空间内使 class 私有并防止其他人从命名空间外部访问 class,例如:
namespace company{
class MyPublicClass{ ... } // This should be accessible
class MyPrivateClass{ ... } // This should NOT be accessible
}
您不能为命名空间设置访问说明符,但可以为 classes:
class company {
// Private (default)
class MyPrivateClass { ... };
public:
class MyPublicClass { ... };
};
您访问 classes 就像使用范围运算符的命名空间一样:
company::MyPublicClass my_public_object;
如果 "public" class 应该可以访问 "private" class,那么 "private" class 必须是 friend
的`public" class.
还有一种方法,就是在public头文件中不包含MyPrivateClass
定义。在源文件中定义 class,或者在仅包含在内部的私有头文件中定义。
选择哪种方式取决于您的设计和用例。
你不能。
C++ 命名空间不提供任何作用域访问器,class 声明也不提供(例如与 C# 相比)。
通常的方法是引入一个 internal
命名空间来指示 public
不打算使用。
您可以使用 friend
说明符限制访问。
您还可以使用一些技巧,使公开访问界面变得更加困难,如下所述:How can I remove/refactor a «friend» dependency declaration properly?
您可以使用 unnamed namespace
。出现在未命名空间中的名称具有内部链接,但出现在命名空间中且没有任何存储 class 说明符的名称默认情况下具有外部链接。
例如我们有一个名为 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
.
如何在 C++ 的命名空间内使 class 私有并防止其他人从命名空间外部访问 class,例如:
namespace company{
class MyPublicClass{ ... } // This should be accessible
class MyPrivateClass{ ... } // This should NOT be accessible
}
您不能为命名空间设置访问说明符,但可以为 classes:
class company {
// Private (default)
class MyPrivateClass { ... };
public:
class MyPublicClass { ... };
};
您访问 classes 就像使用范围运算符的命名空间一样:
company::MyPublicClass my_public_object;
如果 "public" class 应该可以访问 "private" class,那么 "private" class 必须是 friend
的`public" class.
还有一种方法,就是在public头文件中不包含MyPrivateClass
定义。在源文件中定义 class,或者在仅包含在内部的私有头文件中定义。
选择哪种方式取决于您的设计和用例。
你不能。
C++ 命名空间不提供任何作用域访问器,class 声明也不提供(例如与 C# 相比)。
通常的方法是引入一个 internal
命名空间来指示 public
不打算使用。
您可以使用 friend
说明符限制访问。
您还可以使用一些技巧,使公开访问界面变得更加困难,如下所述:How can I remove/refactor a «friend» dependency declaration properly?
您可以使用 unnamed namespace
。出现在未命名空间中的名称具有内部链接,但出现在命名空间中且没有任何存储 class 说明符的名称默认情况下具有外部链接。
例如我们有一个名为 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
.