友元类和友元函数bug

bug 原因分析

代码存在两个致命性语法 / 逻辑错误,均导致编译失败或运行异常,具体如下:

1. 核心错误:类声明顺序倒置,导致友元访问失败

Student类的stu_print(Teacher& t)方法需要访问Teacher类的私有成员(tNametAge),但 **Teacher类的完整定义在Student类之后 **,编译器在解析Student::stu_print实现时,无法识别Teacher类的内部成员,直接报错 "无法访问Teacher的私有成员" 或 "tName未声明"。

关键逻辑链:

  • Student类中声明了stu_print(Teacher& t)方法;
  • 紧接着实现Student::stu_print,此时Teacher类仅做了前向声明(class Teacher; ,编译器只知道 "存在Teacher类",但不知道其有tNametAge等私有成员;
  • 虽然Teacher类后续声明了friend class Student,但 "友元授权" 发生在stu_print实现之后,编译器无法回溯生效。

Bug 解决方案

针对上述错误,需调整类定义顺序并处理未定义函数,具体修复步骤如下:

步骤 1:调整类定义顺序,确保Teacher先于Student完整定义

Teacher类的完整定义移到Student类之前,使编译器在解析Student::stu_print时,能获取Teacher类的成员信息(包括私有成员和友元授权)。

修复说明

  1. 类顺序调整的核心逻辑 :友元关系的生效依赖 "被访问的类(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;
}
相关推荐
初圣魔门首席弟子4 小时前
switch缺少break出现bug
c++·算法·bug
毕设源码-邱学长4 小时前
【开题答辩全过程】以 Bug交流网站为例,包含答辩的问题和答案
bug
debug 小菜鸟4 小时前
aws 实战小bug
云计算·bug·aws
黑客飓风9 小时前
RTX 4090算力应用
人工智能·chrome·bug
布拉格沃兹基硕德11 小时前
MacOS报错“zsh: command not found: brew”【已解决】
macos·bug
清木Moyu14 小时前
layui tree组件回显bug问题,父级元素选中导致子集全部选中
前端·bug·layui
奶糖 肥晨14 小时前
前端Bug实录:为什么表格筛选条件在刷新时神秘消失?
前端·bug
艾莉丝努力练剑1 天前
【测试开发/测试】详解测试用例(下):详解设计测试用例的方法
linux·经验分享·测试用例·bug·测试
前端小灰狼1 天前
Ant Design Vue Vue3 table 表头筛选重置不清空Bug
前端·javascript·vue.js·bug