即使我通过作用域传递它,我也无法访问我的变量的值

问题描述 投票:0回答:2

我想首先说我是C ++的新手。我一直在学习网站,并试着花几个小时在我的代码中徘徊并尝试新的东西以试图解决这个问题。

当我在修改变量的函数中引用变量时,它返回正确的值。一旦保留了该函数,即使我已将变量传递给下一个函数,值也会重置。我甚至在这里和那里添加couts来显示值以帮助我调试,但没有任何结果。有人能指出我正确的方向吗?我将在下面发布我的代码。谢谢你的帮助,伙计们。

#include <iostream>

//void Loop(int Total, int Spend);
//int NewTotal(int Total, int Spend);
//void Spent(int Total, int Spend);
void UserInput(int Total, int Spend);

// Loops back to UserInput() for next entry input
void Loop(int Total, int Spend)
{
    UserInput(Total, Spend);
}

int NewTotal(int Total, int Spend)
{
    std::cout << "Output of Total is: " << Total << std::endl;
    std::cout << "Output of Spend is: " << Spend << std::endl;
    return Total + Spend;
}

void Expense()
{
    std::cout << "Please enter a description of your expense!" << std::endl;
    char ExpenseDesc;
    std::cin >> ExpenseDesc;
    std::cout << "You described your expense as: " << std::endl;
    std::cout << ExpenseDesc << std::endl;
}

void Spent(int Total, int Spend)
{
    std::cout << "Please enter the amount you spent!" << std::endl;
    std::cin >> Spend;
    NewTotal(Total, Spend);
}

void UserInput(int Total, int Spend)
{
    Expense();
    Spent(Total, Spend);
    std::cout << "Result of Total and Spend (NewTotal) is: " << Total + Spend << std::endl;
    std::cout << "Record saved!" << std::endl;
    std::cout << "So far, you have spent " << NewTotal(Total, Spend) << "!" << std::endl; //int Total & int Spend not retaining value when NewTotal(Total, Spend) gets called again to return value
    std::cout << "Ready for next entry!" << std::endl;
    Loop(Total, Spend);
}

int main()
{
    int Total;
    int Spend; 
    Spend = 0;
    Total = 0;
    UserInput(Total, Spend);
    return 0;
}

从本质上讲,这是一个非常基本的提示,要求您提供事务的描述(只接受一个字符,我需要修复它)和交易金额。完成该条目后,您可以再创建一个,并且该程序应该将旧总计添加到新总计中以达到目前为止的总支出,然后重复提示。

c++ variables scope
2个回答
4
投票

您需要通过引用传递变量或从函数返回它们。就目前而言,您正在创建每个函数的本地变量的副本,修改副本,然后在范围的末尾丢弃它们。

返回值:

std::pair<int, int> Spent(int Total, int Spend) {
    ...
    return std::make_pair(Total, Spend);
}

// Getting values out
std::pair<int, int> result = Spent(Total, Spend);
int newTotal = result.first;
int newSpend = result.second;
// or
int newTotal, newSpend;
std::tie(newTotal, newSpend) = Spent(Total, Spend);
// or (C++17)
auto [newTotal, newSpend] = Spent(Total, Spend);

参考参数:

void Spent(int& Total, int& Spend) {
    // Modifications to Total and Spend in this function will apply to the originals, not copies
    ...
}

0
投票

另一个选择是传递指针:

void f(int* Total, int* Spent)
{
    *Total = ...;
    *Spent = ...;
}

或者使用std :: tuple:

std::tuple<int, int> f(int Total, int Spent)
{
    ...
    return std::tuple<int, int>(Total, Spent);
}
© www.soinside.com 2019 - 2024. All rights reserved.