未初始化的变量和返回时出错

时间:2014-02-03 11:43:31

标签: c++

我的程序有些问题,我不明白。 在第72行,我得到错误:“错误C4700:未初始化的局部变量'sumInEuros'使用”但是它肯定是初始化的,因为我用它来存储计算? 同样在第66行,我得到“错误C4716:'showPriceInEuros':必须返回一个值” - 为什么必须返回一个值?该函数只是用于向控制台输出消息。

我正在使用VS13而且它是c ++。 任何帮助将非常感谢,因为我被卡住了! 谢谢!

#include <iostream>         //for cin >> and cout <<
#include <cassert>          //for assert
#include <iomanip>          //for endl
#include <Windows.h>

using namespace std;

void processAPrice();
int getPriceInPounds();
int convertPriceIntoEuros(int pounds);
int showPriceInEuros(int pounds, int euros);
int calculateSum(int euros);
void produceFinalData(int sum, int numberOfPrices);

int main()                  
{
    char answer('Y');
    int numberOfPrices(0);

    while (answer = 'Y')
    {
        processAPrice();
        numberOfPrices++;
        cout << "Continue? (Y/N)";
        cin >> answer;
    }

    if (numberOfPrices > 0)
        //produceFinalData(sum, numberOfPrices);


    system("PAUSE");    //hold the screen until a key is pressed
    return(0);
}


void processAPrice()    //
{
    int pounds = getPriceInPounds();
    int euros = convertPriceIntoEuros(pounds);
    int sum = showPriceInEuros(pounds, euros);
    calculateSum(euros);
}

int getPriceInPounds()      //
{
    int priceInPounds;
    cout << "Enter a price (in Pounds): /234";
    cin >> priceInPounds;
    return priceInPounds;
}


int convertPriceIntoEuros(int priceInPounds)    //
{
    const int conversionRate(0.82);
    return priceInPounds / conversionRate;
}

int showPriceInEuros(int pounds, int euros) //
{
    SetConsoleOutputCP(1252);

    cout << "The Euro value of /234" << pounds << "is: \u20AC" << euros;
}


int calculateSum(int euros)     // 
{
    int sumInEuros;
        sumInEuros = (sumInEuros + euros);
    return sumInEuros;
}

void produceFinalData(int sum, int numberOfPrices)      // 
{
    SetConsoleOutputCP(1252);
    cout << "The total sum is: \u20AC" << sum;
    cout << "The average is: \u20AC" << (sum/numberOfPrices);
}

3 个答案:

答案 0 :(得分:4)

好吧,showPriceInEuros函数没有返回它承诺在签名中返回的int。那是错误。

如果该函数不应返回值,则应将其返回类型声明为void

void showPriceInEuros(int pounds, int euros);
//^^

然后:

void showPriceInEuros(int pounds, int euros) {
    SetConsoleOutputCP(1252);
    cout << "The Euro value of /234" << pounds << "is: \u20AC" << euros;
}

当然。

答案 1 :(得分:3)

您没有在此函数中初始化sumInEuros。您将结果存储在其中 - 这是正确的,但要计算您使用未初始化值的结果。

int calculateSum(int euros)     // 
{
    int sumInEuros;
    sumInEuros = (sumInEuros + euros);
    return sumInEuros;
}

回答下面的问题:

我可能会创建一个类PriceCalculator,它具有算法的所有功能和内部状态:

class PriceCalculator {
  int m_sumInEuros;
public:
  PriceCalculator()
  : m_sumInEuros(0) { }

  void processAPrice(int price);
  int getSumInEuros() const { return m_sumInEuros; }

private:
  void updateSum(int priceInEuros);
};

从主要功能中,你应该创建一个这种类型的对象,并给它你想要总和的价格。不要从班上做任何控制台输入。

int main()
{
  PriceCalculator calc;
  char answer('Y');
  int numberOfPrices(0);

  while (answer = 'Y')
  {
    int priceInPounds;

    cout << "Enter a price (in Pounds): /234";
    cin >> priceInPounds;

    calc.processAPrice(priceInPounds);
    numberOfPrices++;
    cout << "Continue? (Y/N)";
    cin >> answer;
  }

...

您可能还想考虑将numberOfPrices添加到计算器类中。最后,您将完成您班级中的所有操作,但是您的班级之外的用户输入和控制台输出。您的课程可以通过这种方式自动测试,并且完全独立于用户界面。

答案 2 :(得分:3)

  

当我用它来存储计算时,肯定会被初始化吗?

计算基于变量的未初始化值:

sumInEuros = (sumInEuros + euros);
              ^^^^^^^^^^ not initialised

也许你可以声明它static,以便在调用函数之间保留它的值,以便计算传递给函数的所有值的总和。通常,最好使用类来管理这样的持久数据,使用成员函数来更新和访问它。

  

为什么必须返回一个值?

因为你这样说:

int showPriceInEuros(int pounds, int euros)
^^^

如果不应返回值,请将返回类型更改为void