当前位置: 首页 > news >正文

友元类和友元函数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源码
/*类的声明
*/
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;
}

http://www.dtcms.com/a/403258.html

相关文章:

  • Zabbix7.4.8(二):通过http监控Nginx相关指标
  • 厦门 外贸网站访问数据库的网站开发语言
  • Gerkin+Pytest(python)实现自动化(BDD)
  • 动态住宅IP vs. 静态数据中心IP:未来趋势与当前选择
  • 子域名做微信开放平台网站应用芜湖企业100强
  • 很那网站建设做网站哪个公司好
  • Kafka的核心概念
  • Zookeeper 与 Kafka
  • 巴斯勒相机:30 年技术沉淀,重新定义机器视觉效率​
  • 【Kotlin进阶】泛型的高级特性
  • h.265格式的视频在浏览器无法正常播放,使用ffprobe转为h.264
  • sysbench mysql 单表 insert 压测 , 自定义lua测试脚本
  • 石家庄制作网站的公司电商流量平台
  • 二手车网站html模板西宁网站设计
  • 零成本上线动态博客:用 Rin + Cloudflare 部署个人博客的完整指南
  • 家用净水器DIY,75G经典5级Ro净水器
  • 七、OpenCV中的视频的读写
  • ClipboardApp —— Mac 专属轻量级剪切板助手(开源)
  • 【开题答辩全过程】以 LoveEditing视频编辑社团网站为例,包含答辩的问题和答案
  • ARM芯片架构之CoreSight ROM Table 的SoC设计思路
  • 门户网站建设的平台搭建hello md5 wordpress
  • LeetCode 485.最大连续1的个数
  • 【综述】Processes at the intracellular scale 细胞内尺度的过程
  • 截取字符串
  • 【LeetCode热题100(29/100)】删除链表的倒数第 N 个结点
  • PyTorch 数据处理与可视化全攻略
  • 【LeetCode】912. 排序数组、手撕快速排序
  • 国内企业建站模板淘宝代运营去哪里找
  • VTK基础(05):VTK的渲染窗口嵌入到QT的控件当中
  • 深入解析 List 容器组件:构建高效、可交互的列表解决方案