朋友班:不能访问私人会员?

Posted

技术标签:

【中文标题】朋友班:不能访问私人会员?【英文标题】:Friend Classes: Cannot Access private members? 【发布时间】:2014-02-06 02:38:54 【问题描述】:

我只是在学习 C++ 朋友课程。正如它在书籍和 tuts 上所说的,朋友类也可以访问所有成员(私有和受保护)。但我的情况并非如此。

我知道有一个我看不到的愚蠢错误。请帮我找到它:D

我的代码:

#include <iostream>
using namespace std;

class A;
class B 
private:
    int num;
public:
    B(int n=0):num(n)

    friend int add(A, B);
    friend int mul(A, B);
    friend int sub(A, B);
    void showthis(A);
    friend class A;
;

class A
private:
    int num;
public:
    A(int n=0):num(n)

    friend int add(A, B);
    friend int mul(A, B);
    friend int sub(A, B);   
;

int add(A a, B b)
    return a.num+b.num;


int sub(A a, B b)
    return a.num-b.num;


int mul(A a, B b)
    return a.num*b.num;



void B::showthis(A a)
    cout<<a.num<<endl;


int main()
    A a(3);
    B b(6);
    cout<<add(a,b)<<endl;
    cout<<mul(a,b)<<endl;
    cout<<sub(a,b)<<endl;
    b.showthis(a);

错误:

q17.cpp: In member function ‘void B::showthis(A)’:
q17.cpp:20:6: error: ‘int A::num’ is private
  int num;
      ^
q17.cpp:43:10: error: within this context
  cout<<a.num<<endl;

【问题讨论】:

友谊不是继承的、传递的或互惠的。 【参考方案1】:

您既未将 B::showthis(A)class B 声明为班级 A 的朋友。

你可以添加任何一个

friend B::showthis(A);

friend class B;

进入 A 类。

【讨论】:

@cipher 您将 A 类声明为 B 的朋友。正如 CaptainObvlious 所说,这种关系不是互惠的。这允许 A 访问 B 的私有成员,但反之则不允许。【参考方案2】:

你可以看到A是B的朋友,但B不是A的朋友。所以你需要在A中声明friend class B

在 A 类中,添加这一行,如 @timrau 答案。

friend class B;

【讨论】:

以上是关于朋友班:不能访问私人会员?的主要内容,如果未能解决你的问题,请参考以下文章

我将“朋友班 xxxxx”放在公共部分还是私人部分有区别吗?

我将“朋友班 xxxxx”放在公共部分还是私人部分有区别吗?

在不使用朋友类的情况下访问私人成员[重复]

为啥这个朋友功能不能访问类的私有成员?

如何在没有“朋友”的情况下访问课外的私人数据成员? [重复]

“受保护的朋友”和“私人保护”有啥区别?