【问题标题】:Friend function of a private inner class私有内部类的友元函数
【发布时间】:2014-04-22 14:08:07
【问题描述】:

我有以下问题。我有一个带有私有内部类的类。我现在想为内部类实现一个朋友交换功能。但是我不知道如何制作非内联交换功能。如果我在内部类中定义它一切正常。如果有人能告诉我如何使它非内联,我将不胜感激:)

一些代码确实说明了问题:

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);
        }       
    }
}

【问题讨论】:

  • 也许你可以稍微改一下你的问题?
  • @GIJoe 如果有什么可以写得更清楚的,我会很乐意这样做。不过,您必须更具体。

标签: c++ private friend


【解决方案1】:

要做到这一点,您需要像任何其他函数一样在 .cpp 文件中定义它:

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

【讨论】:

  • 我想如果 swap 是一个成员函数(在这种情况下是静态的),这将起作用。但这并不是注定的。也许它必须是?
  • 对不起,这是我的误会。我认为您需要添加您的解决方案作为答案。
【解决方案2】:

我想我找到了解决方案。起初对我来说似乎有点奇怪,但它是有道理的。当我尝试在 .cpp 文件中编写交换函数的定义时,编译器告诉我交换无法访问 Inner,因为它是私有的。解决方案是让这个交换函数也成为 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 的朋友)。是的,一个函数可以是多个类的朋友,我不知道这一点。
  • @PeterSchneider 是的。一开始我觉得很奇怪,因为我想象了一个深度嵌套以及编写这么多友元声明的样子:) 但是,如果你有一个深度嵌套的私有类,无论如何你可能有一个设计问题,所以这不是一个真正的问题经常:)
猜你喜欢
  • 1970-01-01
  • 2016-07-10
  • 2013-02-18
  • 2016-07-31
  • 1970-01-01
  • 2011-01-09
  • 2012-11-20
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多