鍍金池/ 問答/C++/ 使用 GetBottles() 存數(shù)據(jù)失敗,運(yùn)行結(jié)果與期望不一致

使用 GetBottles() 存數(shù)據(jù)失敗,運(yùn)行結(jié)果與期望不一致

題目要求,運(yùn)行結(jié)果是這樣的
下面是該程序的運(yùn)行情況:

Enter name of wine: Gully Wash
Enter number of years: 4
Enter Gully Wash data for 4 year(s):
Enter year: 1988
Enter bottles for that year: 42
Enter year: 1994
Enter bottles for that year: 58
Enter year: 1998
Enter bottles for that year: 122
Enter year: 2001
Enter bottles for that year: 144
Wine: Gully Wash
Year Bottles
1988 42
1994 58
1998 122
2001 144
Wine: Gushing Grape  Red
Year Bottles
1993 48
1995 60
1998 72
Total bottle for Gushing Grape  Red: 180
Bye

但是我運(yùn)行之后,是這樣

Wine: Gully Wash
Year Bottles
0 0
0 0
0 0
0 0

應(yīng)該是 GetBottles()沒把數(shù)據(jù)存進(jìn)去,但是我不知道該怎么辦

搜了幾個(gè)答案,寫的都不一樣,一晚上也沒搞清楚哪里不對(duì),所以請(qǐng)教各位
代碼如下

//Winec.h
#pragma once
#ifndef WINEC_H_
#define WINEC_H_
#include<iostream>
#include<string>
#include<valarray>

template<typename Type1, typename Type2>
class Pair
{
private:
    Type1 x;
    Type2 y;
public:
    Pair() :x(0), y(0) {}
    Pair(const Type1 x1, const Type2 x2) :x(x1), y(x2) {}
    ~Pair() {}
    Type1 first() const { return x; }
    Type2 second() const { return y; }
    void setFirst(Type1 x1);
    void setSecond(Type2 x2);
};

template<typename Type1, typename Type2>
void Pair<Type1, Type2>::setFirst(Type1 x1)
{
    x = x1;
}
template<typename Type1, typename Type2>
void Pair<Type1, Type2>::setSecond(Type2 x2)
{
    y = x2;
}


// ===================================
class Wine
{
private:
    typedef std::valarray<int> ArrayInt;
    typedef Pair<ArrayInt,ArrayInt> PairArray;
    std::string label;
    int years;
    PairArray data;
public:
    Wine():label("none"),years(0),data(ArrayInt(),ArrayInt()) {};
    Wine(const char* l, int y, const int yr[], const int bot[]);
    Wine(const char* l, const ArrayInt & yr, const ArrayInt & bot);
    Wine(const char * l, const PairArray & yr_bot);
    Wine(const char * l, int y);
    void GetBottles();
    void Show() const;
    const std::string& Label() {return label;}
    int sum() const {return data.second().sum();}
    
};
#endif // !WINEC_H_
#include <iostream>
#include "Winec.h"

using std::cin;
using std::cout;
using std::cerr;
using std::endl;

Wine::Wine(const char * l, int y, const int yr[], const int bot[])
  : label(l), years(y), data(ArrayInt(yr,y),ArrayInt(bot,y) )
{
}

Wine::Wine(const char * l, const ArrayInt & yr, const ArrayInt & bot)
  : label(l), years(yr.size()), data(ArrayInt(yr), ArrayInt(yr))
{
    if (yr.size() != bot.size())
    {
        cerr << "Year data, bottle data mismatch, array set to 0 size.\n";
        years = 0;
        data = PairArray(ArrayInt(),ArrayInt());
    }
    else
    {
        data.first() = yr;
        data.second() = bot;
    }
}

Wine::Wine(const char * l, const PairArray & yr_bot)
: label(l), years(yr_bot.first().size()), data(yr_bot)  { }

Wine::Wine(const char * l, int y) : label(l), years(y),
    data(ArrayInt(0,y),ArrayInt(0,y))
{}

void Wine::GetBottles()
{
    if (years < 1)
    {
        cout << "No space allocated for data\n";
        return;
    }
    cout << "Enter " << label <<
            " data for " << years << " year(s):\n";
    for (int i = 0; i < years; i++)
    {
        cout << "Enter year: ";
        cin >> data.first()[i];
        cout << "Enter bottles for that year: ";
        cin >> data.second()[i];
    }
}

void Wine::Show() const
{
    cout << "Wine: " << label << endl;
    cout << "\tYear\tBottles\n";
    for (int i = 0; i < years; i++)
        cout << '\t' << data.first()[i] 
             << '\t' << data.second()[i] << endl;
}
#include <iostream>
#include "Winec.h"

int main ( void )
{
    using std::cin;
    using std::cout;
    using std::endl;

    cout << "Enter name of wine: ";
    char lab[50];
    cin.getline(lab, 50);
    cout << "Enter number of years: ";
    int yrs;
    cin >> yrs;

    Wine holding(lab, yrs); // store label, years, give arrays yrs elements
    holding.GetBottles();   // solicit input for year, bottle count
    holding.Show();         // display object contents

    const int YRS = 3;
    int y[YRS] = {1993, 1995, 1998};
    int b[YRS] = { 48, 60, 72};
    // create new object, initialize using data in arrays y and b
    Wine more("Gushing Grape Red",YRS, y, b);
    more.Show();
    cout << "Total bottles for " << more.Label() // use Label() method
         << ": " << more.sum() << endl;          // use sum() method
    cout << "Bye\n";
    return 0;
}
回答
編輯回答
負(fù)我心

Pair 中添加兩個(gè)方法,

Type1 &first() { return x; }
Type2 &second() { return y; }

返回引用,

因?yàn)槟愕脑椒ǚ祷氐氖?code>x與y的copy, 并沒有寫到成員x,y中去.

2018年1月27日 20:46