添加到不起作用的私有变量

时间:2018-02-08 10:09:16

标签: c++ variables private

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

if(isset($_POST["response"]))
{
    $query = "INSERT INTO response(response) VALUES (:response)";
    $statement = $conn->prepare($query);
    $statement->execute(
    array(
    ':response' => $_POST["response"]
    )
        );
    $query = " INSERT INTO response (student_id)
SELECT studentid
FROM student
WHERE studentid = '".$_SESSION['studentid']."'";
 $statement = $conn->prepare($query);
    $statement->execute(

        );

}

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

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;
}

}

据我所知+ =与_money = _money + money相同;

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

2 个答案:

答案 0 :(得分:1)

问题出在这里

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

每当您致电Bank::askLoad时,您都会创建一个新的ColaMachine,这就是上面代码所说的内容。但问题是当您退出ColaMachine并且Bank::askLoan被销毁时,对ColaMachine的任何更改都会被丢弃。这就是你对ColaMachine所做的更改不坚持的原因。

相反,您希望每次调用ColaMachine时都使用相同的Bank::askLoad。在没有看到其余代码的情况下,我不能说最好的方法,但一种方法是将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与<{1}}中声明的完全不同银行。与之前的代码一样,每次调用main时都会创建并销毁Bank bo

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

ColaMachine::chooseDrink

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

答案 1 :(得分:1)

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