【问题标题】:C++ access specifiers, too few?C++ 访问说明符,太少了?
【发布时间】:2011-04-16 16:19:14
【问题描述】:

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

使用这 3 个访问说明符,我怎样才能使方法对项目中的类可用,但对“外国人”不可用 " ??(类似于 C# 中的 internalpublic

【问题讨论】:

标签: c++ access-specifier


【解决方案1】:

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

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

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

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

【讨论】:

  • 1+ - 不错的答案,但也许你应该详细说明一下链接位
  • +1 从那里您可以计划几种方法来隔离您的代码。现在,如果他们在 TR2(或 C++2015)中添加允许指定从外部可见的内容而无需使用(例如)PIMPL 惯用语来拆分类的模块,那就太好了。
  • 我也很好奇“联动”如何让事情变得更好
  • 不能从翻译单元外部通过名称调用具有内部链接的项目。 “外国人”必须筛选代码,找到地址,并通过函数指针调用它。在内联的情况下,该函数甚至可能不作为可以单独调用的代码存在。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    您可以使用passkey friend idiom

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

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


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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 特别注意:C++ 访问修饰符用于组织目的,让编译器帮助您编写更易于维护的代码。它们不是为了安全或保护知识产权。
      猜你喜欢
      • 2016-06-16
      • 2017-09-17
      • 2018-01-30
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多