2

我可以将朋友函数/类的定义放在另一个类中吗?我的意思是这样的:

class Foo
{
    friend void foo() {} // 1
    friend class Bar {}; // 2
};

gcc 编译友元函数,但不能编译友元类。

4

4 回答 4

6

您可以在朋友声明中定义一个friend函数,它具有任何其他方式都无法获得的有趣行为(在封闭类型是模板的情况下)。

您不能在朋友声明中定义一个friend类,也没有必要这样做。如果要创建具有完全访问权限的内联新类型,只需创建嵌套类型即可。作为成员,它将拥有对封闭类型的完全访问权限。唯一的区别是在命名空间级别不会找到该类型,但如果需要,您可以添加 typedef(或者,在命名空间级别定义类并在类中声明友谊)。

class Outer {
   int x;
   class Inner {
      static void f( Outer& o ) { o.x = 5; } // fine
   };
};
于 2012-08-29T16:20:44.100 回答
3

n3337 11.3/2

类不应友元声明中定义。[ 例子:

class A {
friend class B { }; // error: cannot define class in friend declaration
};

—结束示例]

但是你可以使用类似的东西

class Foo
{
    friend void foo() {} // 1
    class Bar { };
    friend class Bar; // 2
};
于 2012-08-29T16:11:06.433 回答
1

您可以创建一个嵌套类,根据缺陷报告 45,该类可以访问该类的私有成员。这是你的意思吗?

“嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。”

这可能不适用于所有编译器,因为在此 C++ 标准缺陷报告之前,嵌套类没有被授予特殊访问权限。

于 2012-08-29T16:18:11.850 回答
0

将代码更改为:-

class Foo 
{
     friend void foo() {} // 1
     friend class Bar ; // 2 
};
于 2012-08-29T16:12:02.977 回答