友元类和友元函数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;
}
相关推荐
深念Y3 小时前
Opencode Event 表写入优化方案
数据库·人工智能·ai·node.js·bug·优化·opencode
姚青&1 天前
Bug基本概念
bug
AI多Agent协作实战派1 天前
AI多Agent协作系统实战(三十九):AI修对了Bug,却越了权——自动化团队的第一条铁律
人工智能·自动化·bug
深念Y3 天前
AMD 芯片组驱动触发高频 SSD 写入的问题及解决方案
windows·bug·ssd·日志·芯片·驱动·amd
加油码3 天前
探秘 volatile关键字:编译器的过度优化
linux·bug·信号处理
鹿屿二向箔3 天前
keil5.39版本使用AC6编译器不能位域操作的BUG使用STM32U385系列MCU
stm32·单片机·bug
angryshan4 天前
goLang配置断点流程
go·bug
吨吨ai5 天前
# ChatGPT Plus / Pro + Codex Debug 实战:如何让 AI 从日志、Trace、异常堆栈自动定位线上 Bug
人工智能·chatgpt·bug
灰暗世界%6 天前
飞牛bug修复
bug
凌云拓界8 天前
NodeVerdict | 性能门禁:把追踪数据变成 CI 规则
ci/cd·信息可视化·开源·node.js·bug·数据可视化·安全架构