为了账号安全,请及时绑定邮箱和手机立即绑定

大神给看看C++友元哪里出错了,编译一直报错

大神给看看C++友元哪里出错了,编译一直报错

C C++
qq_满天星_21 2017-09-20 21:09:27
#include <iostream>#include <string>using namespace std;class midstu;class student{public: student(string nam,int a,char s):name(nam),age(a),sex(s){}; friend void midstu::diaoyong(student &);private: void showtalk(); string name; int age; char sex;};void student::showtalk(){ cout<<"it's a joke!!"<<endl;}class midstu{public: midstu(int nu,string nam,int a,char s):num(nu),name(nam),age(a),sex(s){};  void diaoyong(student &);private: int num; string name; int age; char sex;};void midstu::diaoyong(student &d){ d.showtalk(); cout<<d.age<<endl;}int main(){ midstu mstu(001,"li si",23,'f'); student s("li",22,'m'); mstu.diaoyong(s); return 0;}
查看完整描述

1 回答

?
onemoo

TA贡献883条经验 获得超454个赞

在 student 中你是将 midstu 的成员函数声明为友元,那么在 student 的定义前仅放 midstu 的前置声明是不够的。因为编译器在看到那句友元声明时必须得知 midstu 到底有哪些成员。

所以你应该将 midstu 的类定义放在 student 的类定义前,但 midstu::diaoyong 的实现不能在 student 之前(毕竟这时还没有 student 的类定义,所以也没法实现)。 当然又因为 diaoyong 中出现了 student 的引用,所以在此之前需要前置声明 student。

然后才是 student 的类定义(以及实现也可以放在这里)。

在 student 类定义出现之后,才可以放 midstu::diaoyong 的实现。

大致结构应该是这样的:

class student;  // 前置声明 student

class midstu {  // midstu 的类定义,但 diaoyong 暂时还不能在这里实现
    ...
    void diaoyong(student &);  // 因为这里用了 student 所以才需要上面的前置声明
    ...
};

class student {  // 有了上面 midstu 的类定义之后才能声明它成员的友元
    friend void midstu::diaoyong(student &);  // midstu 成员函数的友元声明
    ...
};

void midstu::diaoyong(student &d)  // 在上面 student 的类定义出现之后,才可以实现 diaoyong
{
    d.showtalk();
    cout << d.age << endl;
}


查看完整回答
反对 回复 2017-09-20
  • 1 回答
  • 1 关注
  • 1317 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信