友元类和友元函数bug
bug 原因分析
代码存在两个致命性语法 / 逻辑错误,均导致编译失败或运行异常,具体如下:
1. 核心错误:类声明顺序倒置,导致友元访问失败
Student
类的stu_print(Teacher& t)
方法需要访问Teacher
类的私有成员(tName
、tAge
),但 **Teacher
类的完整定义在Student
类之后 **,编译器在解析Student::stu_print
实现时,无法识别Teacher
类的内部成员,直接报错 “无法访问Teacher
的私有成员” 或 “tName
未声明”。
关键逻辑链:
Student
类中声明了stu_print(Teacher& t)
方法;- 紧接着实现
Student::stu_print
,此时Teacher
类仅做了前向声明(class Teacher;
),编译器只知道 “存在Teacher
类”,但不知道其有tName
、tAge
等私有成员; - 虽然
Teacher
类后续声明了friend class Student
,但 “友元授权” 发生在stu_print
实现之后,编译器无法回溯生效。
Bug 解决方案
针对上述错误,需调整类定义顺序并处理未定义函数,具体修复步骤如下:
步骤 1:调整类定义顺序,确保Teacher
先于Student
完整定义
将Teacher
类的完整定义移到Student
类之前,使编译器在解析Student::stu_print
时,能获取Teacher
类的成员信息(包括私有成员和友元授权)。
修复说明
类顺序调整的核心逻辑:友元关系的生效依赖 “被访问的类(
Teacher
)先完整定义”,因为编译器需要明确知道 “被授权访问的成员是否存在”。若仅做前向声明(class Teacher;
),编译器无法获取成员信息,友元授权也无法生效。
bug源码
/*类的声明
*/
class Teacher;
class Student;class Student {public:int v1 = 100;protected:int v2 = 200;//string name;//int age;private:int v3 = 300;string name;int age;public:void printInfo() {cout << "v1=" << v1 << endl;cout << "v2=" << v2 << endl;cout << "v3=" << v3 << endl;}Student() {}Student(string name, int age) {this->name = name;this->age = age;}//stu_print()函数声明void stu_print(Teacher& t);/*友元函数*/friend void printName(Student s);/*友元类*/
};void Student::stu_print(Teacher &t) {cout << this->name << " "<< this->age << endl;gekai();cout << t.tName << " "<< t.tAge << endl;
}class Teacher {
private:string tName;int tAge;public:/*添加友元类Student类是Teacher类的友元类,Student类可以访问Teacher的成员变量和成员方法*/friend class Student;Teacher(string name, int age) {this->tName = name;this->tAge = age;}Teacher() {}};/*友元类测试
*/
void testFriend() {Student s1("小明", 22);Teacher t1("tea", 50);s1.stu_print(t1);
}int main() {//test1();testFriend();return 0;
}