C ++类的初学者问题,可能是析构函数

时间:2012-07-09 01:08:30

标签: c++

以下是我目前的家庭作业的代码。该程序使用几个重载操作符来提示用户他们三餐的名称和卡路里计数,然后显示结果。第一次通过时一切正常,但是在第二次通过时它有点奇怪。无论第一餐是用户被提示,将保留其上一轮的名称。可以输入该餐和下三餐的所有其他值,但无论如何,第一餐的名称都保持不变。只是希望有人可以帮我指出正确的方向。谢谢!

#include <iostream>
#include <iomanip> 
#include <string>

using namespace std;

/*********************************************************************
File Name: meal.cpp
Author: Neal Rodruck
Date: 7/8/12
Purpose: To provide intergallactic travelers a means of measuring their
         daily caloric intake.
*********************************************************************/

class Meal
{
private:
    string name;
    int calorie;
public:
    //Class constructors
    Meal() : name("Meal 1"), calorie(0)
    {}
    Meal(string name, int calorie) : name(name), calorie(calorie)
    {
        while (calorie < 1)
        {
            cout << "Please enter a caloric value greater than 0!: ";
            cin >> calorie;
        }
    }

    //Class destructor
    Meal::~Meal()
    {}

    //get functions
    string getName() { return name; }
    int getCalorie() { return calorie; }

    //set functions
    void setName(string n) { name = n; }
    void setCalorie(int c) { calorie = c; }

    //Overloaded operators
    friend ostream &operator<<(ostream &out, Meal m);
    friend istream &operator>>(istream &in, Meal &m);
    friend Meal operator+(Meal a, Meal b);
};

//Calculate two or more meal objects to obtain daily total
Meal operator+(Meal a, Meal b)
{
    return Meal("Daily Total", a.calorie + b.calorie);
}

//Prompt user for name and calorie information 
//for Meal object as well as test for greater 
//than zero calorie total
istream &operator>>(istream &in, Meal &m)
{
    char name[21];
    int calorie = 0;

    cout << "Enter name: ";
    cin.getline(name, 21);  
    cout << "Enter calories: ";
    in >> calorie;

    while (calorie < 1)
    {
        cout << "Please enter a caloric value greater than 0!: ";
        cin >> calorie;
    }

    m.setName(name);
    m.setCalorie(calorie);
    cin.ignore();

    return in;
}

//Display object information
ostream &operator<<(ostream& out, Meal m)
{
    out << "Name: " << m.name << " Calories: " << m.calorie;
    return out;
}

//function prototypes
void makeNull(Meal& breakfast, Meal& lunch, Meal& dinner);
void introduction();
void display(Meal b, Meal l, Meal d, Meal t);
void end();
void enterMealInfo(Meal& breakfast, Meal& lunch, Meal& dinner);

int main()
{
    //Display introductory message
    introduction();

    //Meal Objects
    Meal breakfast;
    Meal lunch;
    Meal dinner;

    //Capture user response
    char response = ' ';

    //Use loop to allow user to enter information for 
    //more than one day
    while (response != 'n')
    {


        //Prompt user for meal information
        enterMealInfo(breakfast, lunch, dinner);

        //Use information captured to create Daily Total meal object
        Meal total(breakfast + lunch + dinner);

        //Display results
        display(breakfast, lunch, dinner, total);

        //Prompt user for more input
        cout << "Would you like to check again? Please selct \"y\" or \"n\": ";
        cin >> response;
        response = tolower(response);
    }

    //Display exit message
    end();

    return 0;
}

//Display introductory message
void introduction()
{
    cout << "Welcome to The Voyager Trek!";
    cout << "\nPlease use this app to keep track of your daily caloric intake!\r\n";
}

//Display meal and summary information
void display(Meal b, Meal l, Meal d, Meal t)
{
    cout << "\n" << left << setw(20) << "Meal" << right << setw(20) << "Calories";
    cout << "\n" << left << setw(20) << b.getName();
    cout << right << setw(20) << b.getCalorie();
    cout << "\n" << left << setw(20) << l.getName();
    cout << right << setw(20) << l.getCalorie();
    cout << "\n" << left << setw(20) << d.getName();
    cout << right << setw(20) << d.getCalorie();
    cout << "\n" << "----------------------------------------";
    cout << "\n" << left << setw(20) << t.getName();
    cout << right << setw(20) << t.getCalorie() << "\n";
}

//Display exit message
void end()
{
    cout << "\r\nThank you for using our app, goodbye!\r\n";
    system("pause");
}

//Using meal objects passed by reference this function 
//will populate appropriate objects with name and calorie
//information
void enterMealInfo(Meal& breakfast, Meal& lunch, Meal& dinner)
{
    cout << "\r\nWhat did you have for breakfast?\r\n";
    cin >> breakfast;
    cout << "What did you have for lunch?\r\n";
    cin >> lunch;
    cout << "What did you have for dinner?\r\n";
    cin >> dinner;
}

2 个答案:

答案 0 :(得分:4)

问题是在while循环中使用此行:

cin >> response;

当用户点击回车键时,在输入缓冲区中会留下一个尾随换行符。由于您的函数enterMealInfo使用了getline,并且getline正在寻找换行符,因此它会立即找到它正在查找的内容,因此它不会提示用户。如果在循环结束时添加此行:

cin.ignore();

它将删除换行符。


另一方面,正如Mr.Ree在下面的评论中提到的那样,你的输入操作符有点奇怪。您将istream作为第一个参数,但不使用它。相反,您只需使用cin。你应该使用传入的istream,如in.getline(name, 21);in >> calorie;等......

答案 1 :(得分:0)

很确定,你忘了同步输入。

试试这个:

...
while (response != 'n')
{
    //Sync the input stream 
    cin.sync();

    //Prompt user for meal information
    enterMealInfo(breakfast, lunch, dinner);
...