添加到私有变量不起作用
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
函数中声明 Bank
和 ColaMachine
。
//ColaMachine Object
ColaMachine cola;
//Bank Object
Bank bank;
这些应该是您创建的仅有的两个 Bank
和 ColaMachine
对象,所以这是错误的
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;
。
【讨论】:
以上是关于添加到私有变量不起作用的主要内容,如果未能解决你的问题,请参考以下文章
将带有 URL 变量的超链接添加到数据表(jQuery)+ 搜索不起作用