鱼C论坛

 找回密码
 立即注册
查看: 167|回复: 2

为什么声明了友元函数还是不能访问私有变量?

[复制链接]
发表于 2024-3-30 18:52:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
using namespace std;

//____qcodep____
//声明活期储蓄类
class CurrentSavings
{
private:
    int balance;

public:
    CurrentSavings(int balance) {
        //____qcodep____
        this->balance = balance;
    }
    //____qcodep____
    friend void printTotalSavings(TimeSavings& ts, CurrentSavings& cs);
    int print() {
        cout << this->balance << endl;
    }
};

//声明定期储蓄类
class TimeSavings
{
private:
    int balance;

public:
    TimeSavings(int balance) {
        //____qcodep____
        this->balance = balance;
    }
    //____qcodep____
    friend void printTotalSavings(TimeSavings& ts, CurrentSavings& cs);
    int print() {
        cout << this->balance << endl;
    }
};


void printTotalSavings(TimeSavings& ts, CurrentSavings& cs)
{
    //____qcodep____
    cout << ts.balance + cs.balance << endl;
}

int main(void)
{
    int cs, ts;
    cin >> cs >> ts;

    CurrentSavings cs1(cs);
    TimeSavings ts1(ts);

    cs1.print();
    ts1.print();
    printTotalSavings(ts1, cs1);

    return 0;
}
这段代码已经在class TimeSavings和class CurrentSavings都声明了友元函数,但是为什么在cout << ts.balance + cs.balance << endl;中只有ts.balance可以访问,但是cs.balance却无法访问呢?
1a7f3aec35aec0dcb856864174491f8.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-30 18:52:38 | 显示全部楼层
在C++中,友元函数可以访问类的私有成员变量。但是,你的代码存在一些问题。

首先,在你的代码中,声明了两次相同的友元函数 `printTotalSavings(TimeSavings& ts, CurrentSavings& cs)`,这是不必要的。你只需要在其中一个类中声明该友元函数即可。

其次,在你的 `print()` 函数中,有两处错误:
1. 在第一个 `print()` 函数中,`cout` 语句的格式有误。应该是 `cout << "balance = " << balance;`。
2. 第二个 `print()` 函数中,你使用了未定义且未声明的变量 `ts`,这会导致编译错误。

修复上述错误后的代码示例如下:

  1. #include <iostream>
  2. using namespace std;

  3. // 声明定期储蓄类
  4. class TimeSavings;

  5. // 声明活期储蓄类
  6. class CurrentSavings
  7. {
  8. private:
  9.     int balance;

  10. public:
  11.     CurrentSavings(int balance) {
  12.         this->balance = balance;
  13.     }

  14.     friend void printTotalSavings(TimeSavings& ts, CurrentSavings& cs);
  15.    
  16.     int print() {
  17.         cout << "balance = " << balance << endl;
  18.         return 0;
  19.     }
  20. };

  21. // 声明定期储蓄类
  22. class TimeSavings
  23. {
  24. private:
  25.     int balance;

  26. public:
  27.     TimeSavings(int balance) {
  28.         this->balance = balance;
  29.     }

  30.     friend void printTotalSavings(TimeSavings& ts, CurrentSavings& cs);
  31.    
  32.     int print() {
  33.         cout << "balance = " << balance << endl;
  34.         return 0;
  35.     }
  36. };

  37. // 定义友元函数
  38. void printTotalSavings(TimeSavings& ts, CurrentSavings& cs) {
  39.     int total = ts.balance + cs.balance;
  40.     cout << "Total savings = " << total << endl;
  41. }

  42. int main() {
  43.     CurrentSavings cs(1000);
  44.     TimeSavings ts(2000);

  45.     cs.print();
  46.     ts.print();
  47.     printTotalSavings(ts, cs);

  48.     return 0;
  49. }
复制代码

现在你可以成功访问 `CurrentSavings` 和 `TimeSavings` 类的私有变量,并输出预期的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-30 19:08:29 | 显示全部楼层
  1. #include <iostream>
  2. using namespace std;

  3. class TimeSavings;

  4. //____qcodep____
  5. //声明活期储蓄类
  6. class CurrentSavings
  7. {
  8. private:
  9.     int balance;

  10. public:
  11.     CurrentSavings(int balance) {
  12.         //____qcodep____
  13.         this->balance = balance;
  14.     }
  15.     //____qcodep____
  16.     friend void printTotalSavings(TimeSavings& ts, CurrentSavings& cs);
  17.     int print() {
  18.         cout << this->balance << endl;

  19.         // return ?;
  20.         return 0;
  21.     }
  22. };

  23. //声明定期储蓄类
  24. class TimeSavings
  25. {
  26. private:
  27.     int balance;

  28. public:
  29.     TimeSavings(int balance) {
  30.         //____qcodep____
  31.         this->balance = balance;
  32.     }
  33.     //____qcodep____
  34.     friend void printTotalSavings(TimeSavings& ts, CurrentSavings& cs);
  35.     int print() {
  36.         cout << this->balance << endl;

  37.         // int print
  38.         return -1;
  39.     }
  40. };


  41. void printTotalSavings(TimeSavings& ts, CurrentSavings& cs)
  42. {
  43.     //____qcodep____
  44.     cout << ts.balance + cs.balance << endl;
  45. }

  46. int main(void)
  47. {
  48.     int cs, ts;
  49.     cin >> cs >> ts;

  50.     CurrentSavings cs1(cs);
  51.     TimeSavings ts1(ts);

  52.     cs1.print();
  53.     ts1.print();
  54.     printTotalSavings(ts1, cs1);

  55.     return 0;
  56. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 05:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表