通过友元函数访问两个类私有变量遇输出异常,求排查解决
问题诊断与修复方案
你遇到的垃圾值问题根源完全出在构造函数的赋值逻辑上,和友元函数本身没有关系。咱们来拆解一下问题:
核心错误:构造函数赋值方向颠倒+无效语法符号
看你的Sale和Salesperson构造函数:
Sale::Sale(string d, double t, int S) { >>d = date; >>t = total; >>S = SalespersonIdNum; }
这里犯了两个关键错误:
- 赋值方向搞反:你把类的私有成员变量(比如
date)赋值给了函数参数(d),而不是把参数值赋给成员变量。这直接导致类的成员根本没被初始化,保留的是内存里的随机垃圾值。 - 多余的
>>符号:这些符号是完全无效的语法,应该直接删掉。
Salesperson的构造函数也重复了同样的错误:
Salesperson::Salesperson(int i, string l) { >>i = idNum; >>l = lastName; }
修正后的构造函数代码
把赋值方向反过来,去掉无效符号即可:
修正Sale构造函数
Sale::Sale(string d, double t, int S) { date = d; total = t; SalespersonIdNum = S; }
修正Salesperson构造函数
Salesperson::Salesperson(int i, string l) { idNum = i; lastName = l; }
更推荐用成员初始化列表的写法(更高效、规范):
// Sale构造函数的初始化列表写法 Sale::Sale(string d, double t, int S) : date(d), total(t), SalespersonIdNum(S) {} // Salesperson构造函数的初始化列表写法 Salesperson::Salesperson(int i, string l) : idNum(i), lastName(l) {}
为什么会输出垃圾值?
C++中,未初始化的基本数据类型成员(如int、double)会保留内存地址上的原有随机值,也就是你看到的那些无意义数字;字符串成员未初始化则会是空值。你的构造函数不仅没给成员变量赋值,反而修改了函数参数(这对类成员毫无影响),所以display函数访问的全是未初始化的垃圾数据。
修正后的预期输出
修复构造函数后,程序会输出你预期的初始化值:
ID of person who completed sale: 123 Sale Total: 78.45 Sale Date: 10/06/2008 Sales Person ID: 123 Sales Person Last Name: Pelletier ID of person who completed sale: 321 Sale Total: 162.59 Sale Date: 05/21/2010 Sales Person ID: 321 Sales Person Last Name: Howel
内容的提问来源于stack exchange,提问作者Louis Pelletier
相关产品推荐
相关产品推荐

