例如,假设我编写了如下代码:
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
的朋友的同时更改代码?还是有更好的方法?
答案 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;
}