gpt4 book ai didi

c++ - 给定一个类及其 friend 类,后者的内部类是否自动成为前一个类的 friend ?

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:52 25 4
gpt4 key购买 nike

我正在尝试使用开源项目。最新的官方版本(来自 *.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 Bfriend 不会给出与 A friendB 的船权。从 A 派生的类和与 Afriend 的类都不会与 B< 一起friend/。我认为该限制也适用于内部类。

我使用的是 2002 年的计算机,其中有几个操作系统版本,而程序(大概是它的设计团队)主要在较新的计算机上使用。我的系统编译器是不是太旧了,或者是新的编译器允许了它们不应该允许的东西?这是 C++11 的变化吗?

我只想使用这个程序,但我总是卡在这样的事情上。我已经开始怀疑了,因为代码中充满了诸如“拥有数量可笑的 friend 的私有(private)数据”和“无处不在的内部类”之类的技术,我认为这些都是代码的味道。该团队正在一起使用这些技术,但我认为它们从根本上是不兼容的,因为 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。)

附录

看到第一个回复,现在我怀疑将类(class)标记为 friend 有两种解释。给定一个 class A,其中有一个 friend class X,该声明可以授予访问权限:

  1. X 的成员函数(static 或 special 或两者都不是)。
  2. 任何函数,包括特殊函数,其完全限定名称具有X 的完全限定名称作为前缀。

我认为我的编译器使用第一个定义,而作者的编译器使用第二个。有官方说法正确的解释吗?如果是这样,规范是什么时候出现的(C++98/03,缺陷报告,C++11)?我一直认为友元意味着第一个版本(包括我读过的 C++ Material );第二个直到现在才进入我的脑海。

最佳答案

我认为这里有两个问题。一是代码闻起来很糟糕,如您所说,二是它无法在您的系统上编译。关于气味,是的,过度使用 friend 关键字通常表示糟糕的 OO 设计。通常,为对象提供它完成其工作所需的东西比从中提取东西要好,这实际上是 friend 允许您做的事情。

大量的内部类,IMO,并没有那么糟糕,因为它们只是用来将类保持在另一个类的范围内。这有助于使命名空间不那么困惑,并允许您在不同的功能区域使用通用名称。

关于编译问题,我尝试在我的系统(Ubuntu 10.04,gcc 4.4.3,此时已有两年历史)上重现它,并创建了这个示例程序:

class A
{
friend class B;

int x;
};

class B
{
class Inner
{
public:
void foo(A& a)
{
a.x++;
}
};

public:
void bbb()
{
Inner i;
A a;

i.foo(a);
}
};

int main()
{
B b;

b.bbb();
}

此编译没有错误或警告。我最初没有任何标记为公共(public)的,但我需要添加 bbb() 来创建类 Inner 的实例,并且我必须添加 Inner 的公共(public)方法 这样我就可以调用它来用 A 做一些事情。

结果是我认为你的开发系统已经过时了。主要开发人员显然在编译他们的代码时没有问题,所以区别必须与您的系统有关,否则他们已经以他们没有告诉您的方式配置了他们的系统。话虽这么说,我认为他们可以做更多的工作来使他们的代码更具可移植性和更易于构建。在开源项目中,如果您希望其他人做出贡献,那是意料之中的事情。

关于c++ - 给定一个类及其 friend 类,后者的内部类是否自动成为前一个类的 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com