一个私有内部类的友元函数

5
我有以下问题:我有一个包含私有内部类的类。现在,我想为内部类实现一个友元交换函数。然而,我不知道如何创建非内联交换函数。如果我在内部类中定义它,一切都正常。如果有人能向我展示如何使其非内联,我将不胜感激 :)
以下是一些用于说明问题的代码:
class Outer
{
    class Inner
    {
        int data;

        friend swap(Inner& lhs, Inner& rhs)  // what is the syntax to 
        {                                    // make this function non inline?
            using std::swap;
            swap(lhs.data, rhs.data);
        }       
    }
}

也许您可以稍微改一下问题的措辞? - Engineer2021
@GIJoe 如果有什么可以写得更清楚的地方,我很乐意去做。不过你需要更具体一些。 - rozina
2个回答

10

我认为我找到了解决方案。一开始它对我来说有点奇怪,但是这很有道理。当我尝试在.cpp文件中编写swap函数的定义时,编译器告诉我swap无法访问Inner,因为它是私有的。解决方案是将这个swap函数也作为Outer的友元函数!

代码如下:

.h:

class Outer
{
    class Inner
    {
        int data;

        friend swap(Inner& lhs, Inner& rhs);     
    }
    friend swap(Inner& lhs, Inner& rhs);
}

.cpp:

void swap(Outer::Inner& lhs, Outer::Inner& rhs)
{
    using std::swap;
    swap(lhs.data, rhs.data);
} 

因为它不仅访问了Outer的私有嵌套类Inner(为此它必须是Outer的友元),还访问了Inner的私有成员数据(为此它必须是Inner的友元)。是的,一个函数可以是多个类的友元,我之前并不知道。 - Peter - Reinstate Monica
@PeterSchneider 是的,完全正确。一开始我觉得很奇怪,因为我想象了深层嵌套和编写如此多的友元声明会是什么样子:) 但是,如果您有深层嵌套的私有类,那么您可能存在设计问题,因此通常这不是真正的问题 :) - rozina

1
要做到这一点,您需要像任何其他函数一样在 .cpp 文件中定义它:
Outer::Inner::swap(Outer::Inner& lhs, Outer::Inner& rhs)
{
    using std::swap;
    swap(lhs.data, rhs.data);
}

如果swap是一个成员函数(在这种情况下是静态的),那么我想那应该可以工作。但它并不是打算这样做的。也许它必须这样做? - rozina
抱歉,这是我的误解。我认为你需要将你的解决方案添加为答案。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接