【发布时间】:2012-04-11 07:56:18
【问题描述】:
我正在尝试使用开源项目。最新的官方(来自 *.tar.gz 文件)和前沿(来自 SVN 存储库)版本都执行以下操作:
class Type1 {
friend class Ridiculous;
friend class Number;
friend class Of_Friends;
int ImportantPrivateSemiSharedData;
};
// In another header...
class Ridiculous {
class Inner {
void MyFunc( Type1 &t )
{ /*do something with t.ImportantPrivateSemiSharedData*/ }
};
};
AFAIK,将class A 标记为class B 的friend 确实不 提供与A friendship 相关的任何类型B。从A 派生的类和friendly 和A 的类都不能得到friendship 和B。我认为这种限制也适用于内部类。
我使用的是 2002 年的计算机,它保留了几个操作系统版本,而该程序(可能是它的设计团队)主要在较新的计算机上。我的系统编译器只是旧的和破坏的,还是新热的编译器允许他们不应该做的事情?这是 C++11 的变化吗?
我只是想使用这个程序,但我一直卡在这样的事情上。我已经很怀疑了,因为代码中充满了诸如“拥有大量朋友的私人数据”和“无处不在的内部类”之类的技术,我认为这些都是代码异味。团队正在一起使用这些技术,但我认为它们从根本上是不兼容的,因为 friendship 不会继承,并且您不能前向声明内部类。
(如果需要,我正在使用 Mac OS X Tiger 10.4.11/PowerPC 32 位(配备 G4 的 eMac)。该程序是 LLVM 和 CLang(以及 LLVM 测试套件),尝试从 v3 .0 档案和来自 Subversion 的 r153311。编译器是 Apple 提供的 GCC 4.0.1 和 XCode 2.5。)
附录
看到第一个回复,现在我怀疑将班级标记为朋友有两种解释。给定一个包含friend class X 的class A,该声明可以授予对以下内容的访问权限:
-
X的成员函数(static或特殊或两者都不是)。 - 任何函数,包括特殊函数,其完全限定名称具有
X的完全限定名称作为前缀。
我认为我的编译器使用第一个定义,而作者的编译器使用第二个。是否有官方说法是正确的解释?如果是这样,规范是什么时候发生的(C++98/03,缺陷报告,C++11)?我一直认为友谊意味着第一个版本(包括我读过的 C++ 材料);直到现在,我才想到第二个。
【问题讨论】:
-
Type1是我一段时间以来见过的最放荡的课程之一,让半个世界的人都搞砸了它的私人......不是评判,只是说。 :) -
如果您没有更新的计算机,您仍然可以使用 ideone.com 测试更新的编译器版本。
-
关于附录,如果 A 类有一个朋友 X 类(即
class A { friend class X; ... };那么 X 类的实例可以访问 A 类的私有成员。我认为你的两种解释(至少我的方式)读它们)有它倒着。正如你和我的例子所示,即使是 X 类的内部类也受益于 A 类与 X 类的友谊。你可以认为在类声明中添加一个朋友子句类似于在其上打开一个洞防火墙:A 类允许 X 类进入。ps 感谢您接受我的回答。:)
标签: c++ friend nested-class