1

据我所知,C++ 中只有 3 个访问说明符:privatepublicprotected

使用这 3 个访问说明符,我怎样才能使一个方法对项目中的类可用但对“外国人”不可用??(如C# 中的内部公共)

4

4 回答 4

8

C++ 不知道项目是什么。

C++ 了解类,它提供了您提到的三个访问说明符。

C++ 知道翻译单元,它提供两个访问说明符:内部链接和外部链接。

编辑:关于内部和外部链接,这与是否会在翻译单元(目标文件)之外看到符号有关。TU 中定义的任何全局变量staticconst变量都具有内部链接。其他人有外部联系。

于 2010-09-24T08:58:35.033 回答
5

简单地说,你没有。C++ 与 C# 不同。

如果您不想让某个类在给定库或可执行文件之外可用,那么就不要将头文件提供给项目的用户。

于 2010-09-24T09:06:48.673 回答
1

您可以使用密码朋友成语

不过,这不是您可以搜索的术语。这个想法并不新鲜,虽然不是很常见,并且有点出现在 SO 上。上面的链接是我对通用解决方案的尝试(在 C++03 中不可能干净,在 C++0x 中很漂亮)。

我敢肯定还有其他方法可以尝试,但由于某种原因,我对上述内容有一个附件......:)


但除此之外,没有。一个更常见和更简单的解决方案是将你的东西放在一个detail命名空间中(例如,在整个Boost中很常见),然后说“不要去那里”。

于 2010-09-24T09:08:28.517 回答
0

最接近解决方案的两件事是

  1. 有一个您在代码中使用的内部命名空间,但您并没有真正公开。然后,您的图书馆的用户使用您使用的任何用于公共消费的命名空间。但是,它没有被强制执行。它只是被混淆了,因为他们不一定知道命名空间或被告知不要使用它,所以他们没有。

  2. 使用朋友。这由编译器强制执行的。如果一个类是另一个类的朋友,或者如果一个函数是一个类的朋友,那么它可以访问其私有成员函数,而其他人不能。不幸的是,这意味着朋友可以访问所有私有成员,因此它可以提供比您想要的更多访问各种类或函数的权限(尽管它会在您自己的类和函数中,而不是在您库的用户中)。

C++ 比 C#、Java 和 D 等语言更古老,它们让您可以更精细地控制访问级别。C++ 开创了很多这类东西,但并不总是正确。新语言的设计者从它身上学到了很多东西,并在很多方面对其进行了改进,所以你会在新语言中找到某些 C++ 所没有的概念(尽管有时 C++ 有一些新语言没有采用的概念)。其他示例是包和密封/最终类和函数。

于 2010-09-24T09:48:28.853 回答