友元类和友元函数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;
}
相关推荐
workflower3 天前
Fundamentals of Architectural Styles and patterns
开发语言·算法·django·bug·结对编程
lvchaoq4 天前
记录小程序真机bug,而模拟器无法复现
小程序·bug
喜欢便码4 天前
禅道提交bug的几种状态
bug
从前慢,现在也慢4 天前
(3)Bug篇
学习·bug·测试
西柚小萌新4 天前
【Bug:docker】--Docker国内镜像源加载失败
docker·容器·bug
初圣魔门首席弟子6 天前
c++ bug 记录(merge函数调用时错误地传入了vector对象而非迭代器。)
java·c++·bug
Qiuner7 天前
历劫波,明真我——Debug Commune
ai·开源·bug·debug·信息差·信息·交流
川石课堂软件测试8 天前
什么是BUG,你对BUG的了解有多少?
android·linux·服务器·python·功能测试·bug·安全性测试
仰望星空的凡人9 天前
【BUG排查】基于RH850F1KMS1的主控出现系统中断错误,调试FEIC的值为0x11
单片机·bug·rh850·renesas