You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过友元函数访问两个类私有变量遇输出异常,求排查解决

问题诊断与修复方案

你遇到的垃圾值问题根源完全出在构造函数的赋值逻辑上,和友元函数本身没有关系。咱们来拆解一下问题:

核心错误:构造函数赋值方向颠倒+无效语法符号

看你的Sale和Salesperson构造函数:

Sale::Sale(string d, double t, int S) {
 >>d = date;
 >>t = total;
 >>S = SalespersonIdNum;
}

这里犯了两个关键错误:

  1. 赋值方向搞反:你把类的私有成员变量(比如date)赋值给了函数参数(d),而不是把参数值赋给成员变量。这直接导致类的成员根本没被初始化,保留的是内存里的随机垃圾值。
  2. 多余的>>符号:这些符号是完全无效的语法,应该直接删掉。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:17:38