我认为这里有两个问题。一个是代码闻起来很糟糕,正如你所说,第二个是它不能在你的系统上编译。关于气味,是的,过度使用了 friend 关键字通常表示糟糕的OO设计。通常更好的是给对象提供它需要做的工作,而不是从中取出一些东西,这本质上是什么 friend 让你做。
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(); }
编译时没有错误或警告。我最初没有任何标记公开,但我需要添加 bbb() 创建一个类的实例 Inner ,我不得不添加一个公共方法 Inner 所以我可以调用它来做一些事情 A 。
bbb()
Inner
A
结果是我认为你的开发系统已经过时了。主要的开发人员显然没有编译代码的问题,因此差异必须与您的系统有关,否则他们已经以他们没有告诉您的方式配置他们的系统。话虽这么说,我认为他们可以做更多的事情来使他们的代码更便携,更容易构建。在开源项目中,如果您希望其他人做出贡献,那就是预期的。