添加到私有变量不起作用

Posted

技术标签:

【中文标题】添加到私有变量不起作用【英文标题】:Adding to a private variable not working 【发布时间】:2018-07-18 20:45:13 【问题描述】:

我目前正在学习 c++ 并尝试制作自动售货机!我知道我的代码真的很糟糕,对此我很抱歉。 我正在尝试实施一家银行并让用户从中获得贷款,唯一的问题是银行无法向用户充值。这是我的代码。

void Bank::askLoan() 
//ColaMachine object
ColaMachine cola;

bool loanGranted = false;

cout << string(100, '\n');
cout << "You do not have enough money!\n\n";
cout << "Would you like to take a loan?\n\n(1)-Yes\n(2)-No\n\n\n";
int choice;
cin >> choice;

switch (choice) 
case 1:
    //Print the bank menu!

    printBank();
    while (loanGranted != true) 
        cout << "Enter the amount to lend: $";
        cin >> _loanValue;
        //Test if _loanValue is less than or = to bankmoney, so they would scam the bank.
        if (_loanValue <= _bankMoney) 
            //Supposed to add money to the user.
            cola.addMoney(_loanValue);
            break;
        
        else 
            cout << "You entered too much! Try again..." << endl;
        
    
    break;
case 2:
    //User does not want to take a loan! Quit the game!
    //Not implemented, yet.
    break;
default:
    cout << "Bad input! Please retry..." << endl;

如果输入的金额在正确的范围内,它会调用 ColaMachine 类的 addMoney() Func。

void ColaMachine::addMoney(int money) 

//This part doesnt seem to modify the actual value
//Whenever It goes back to the main game loop it doesnt change.
_money += money;

据我了解 += 与 _money = _money + money 相同;

我在这里做错了什么? GitHub上的完整源代码- https://github.com/Rohukas/-LearningCPP

【问题讨论】:

似乎没有修改这是什么意思?你怎么知道的? From what I understand += is the same as _money = _money + money; 正确。但听起来你应该学习使用调试器。 阅读您最喜欢的 C++ 书籍中的局部变量,并思考cola 是什么。 (养成将用户交互与数据处理分开的习惯会很有帮助。) 顺便说一句:银行贷款和可乐机到底有什么关系? 【参考方案1】:

问题来了

void Bank::askLoan() 
//ColaMachine object
ColaMachine cola;
bool loanGranted = false;
...

每次调用Bank::askLoad 时,您都会创建一个新的ColaMachine,这就是上面的代码所说的。但问题是,当您退出 Bank::askLoan 并且 ColaMachine 被破坏时,对 ColaMachine 的任何更改都会被丢弃。这就是为什么您对 ColaMachine 所做的更改没有生效的原因。

您希望每次调用Bank::askLoad 时都使用相同的ColaMachine。如果不查看其余代码,我不能说最好的方法,但一种方法是将ColaMachine 作为参考参数传递给Bank::askLoad

void Bank::askLoan(ColaMachine& cola) 
bool loanGranted = false;
...

另一种方法是将ColaMachine 设为Bank 的类成员变量

class Bank

    ...
    void askLoan();
private:
    ColaMachine cola;
;

哪个更好?不知道。我认为您需要阅读类设计,以及程序中的对象应该如何相互关联。这似乎是你目前没有得到的东西。

================================================ ============================

查看了您的完整代码后,我发现您在不止一个地方犯了同样的错误。在 main 函数中声明 BankColaMachine

//ColaMachine Object
ColaMachine cola;
//Bank Object
Bank bank;

这些应该是您创建的仅有的两个 BankColaMachine 对象,所以这是错误的

void ColaMachine::chooseDrink() 
    Bank bo;
    ...
    bo.askLoan();

Bank bo 与您在main 中声明的银行完全不同。和之前的代码一样,每次调用 ColaMachine::chooseDrink 时都会创建和销毁 Bank bo

我认为您应该做的是将 main 中声明的 ColaMachine 和 Bank 变量作为引用参数传递给需要使用它们的代码的其他部分。所以(例如)

void ColaMachine::chooseDrink(Bank& bank) 
    ...
    bank.askLoan();

您需要对这段代码进行大量重写。

【讨论】:

【参考方案2】:

问题是您在 askLoan() 方法中创建了新的可乐对象,该对象在函数结束时被销毁,因此调用 addMoney() 方法会修改该临时可乐对象的状态。一种选择是通过指向askLoan() 方法的指针来提供可乐对象。 例如,在ColaMachine::chooseDrink() 中,您将调用bo.askLoan(this)this 是指向您调用 bo.askLoan() 的对象的指针。 您需要修改您的 askLoan() 签名: void askLoan(ColaMachine * cola) 并从 askLoan() 本身中删除 ColaMachine cola;

【讨论】:

以上是关于添加到私有变量不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C++ 友元函数不起作用,在此上下文中为私有错误

将带有 URL 变量的超链接添加到数据表(jQuery)+ 搜索不起作用

将 Gatsby 部署到 Heroku... .env 变量不起作用

反应路由器重定向在私有路由中不起作用

将类添加到按钮后功能不起作用

反应路由器私有路由/重定向不起作用