
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源码
cpp
/*
类的声明
*/
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;
}