我应该如何在嵌套类中正确使用朋友声明?

时间:2018-10-27 06:04:06

标签: c++ class c++11 friend

例如,假设我编写了如下代码:

class A
{
private:
    class B
    {
    private:
        int a;
        friend int A::foo(B &b);
    };
    int foo(B &b)
    {
        return b.a;
    }
};

由于a中的B是私有的,要在a的函数foo中使用A,我将使用friend,以便foo实际上可以访问a。但是,此代码给出了无法访问a的错误。代码的问题是什么,如何在保持a私有且A不成为B的朋友的同时更改代码?还是有更好的方法?

1 个答案:

答案 0 :(得分:3)

如果只想获取a类的B,则需要一个getter函数。这应该是最简单的方法。

class B
{
private:
    int a;
public:
    // provide getter function
    const int& getMember_a()const { return a; }
};

以及foo函数中

const int& foo(const B &b)const 
{
    return b.getMember_a(); // call the getter to get the a
}

关于您的代码问题;在friend int A::foo(B &b);类的B行中,它不知道函数A::foo。因此,我们需要在类int foo(B &);之前转发声明B。然后是问题; A::foo(B &)是否了解B。也没有但是幸运的是,C ++还通过向前声明类来允许具有不完整的类型。这意味着,按照自己的方式,您可以实现所需的目标。

class A
{
private:
    class B;      // forward declare class B for A::foo(B &)
    int foo(B &); // forward declare the member function of A
    class B
    {
    private:
        int a;
    public:
        friend int A::foo(B &b);
    };
};
// define, as a non-member friend function
int A::foo(B &b)
{
    return b.a;
}