猿问

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

#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;


}


qq_满天星_21
浏览 1318回答 1
1回答

onemoo

在 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; }
随时随地看视频慕课网APP
我要回答