友元类和友元函数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;
}
相关推荐
一只自律的鸡1 天前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
Lichenpar3 天前
Springboot采用FastJson2作为MessageConverter时,配置的全局日期类型序列化转换BUG
java·开发语言·bug
Irene19913 天前
AI 找 bug 的局限性 和 Deepseek 优势明显
bug
癫狂的兔子4 天前
【bug】【Python】pandas中的DataFrame.to_excel()和ExcelWriter的区别
python·bug
癫狂的兔子4 天前
【BUG】【Python】【Spider】Compound class names are not allowed.
开发语言·python·bug
netkiller-BG7NYT4 天前
阿里云语音合成CosyVoice重大BUG被我发现了
bug
马猴烧酒.5 天前
【Mybatis出现bug】应为 <statement> 或 DELIMITER,得到 ‘id‘
java·bug·mybatis
请叫我大虾5 天前
发现一个jdk中ArrayList的小BUG
android·java·bug
离离茶5 天前
【笔记1-10】Qt bug记录:dockwidget通过raise在最前面显示,toolbar的拓展菜单失效
笔记·qt·bug
测试_AI_一辰5 天前
Agent & RAG 测试工程笔记 01:Tool Calling 跑通 + 本地 PDF 接入(智谱 GLM)
人工智能·笔记·功能测试·自动化·bug