【问题标题】:overloading operator >>, passing one parameter to object instead of 3重载运算符>>,将一个参数传递给对象而不是3
【发布时间】:2015-12-21 16:49:30
【问题描述】:

我有一个日期类型的对象“d”。我正在尝试使用重载运算符仅从用户那里获取一个参数,而不是对象具有的三个参数。换句话说,我希望程序能够从用户那里获取输入,并且只能更改“month_”数据成员,然后将该数据成员传递给“incMon()”,以便月份和year 根据用户希望仅使用“month_”数据成员增加日期的月份进行相应调整。

如何调整重载运算符和 incMon() 以允许此过程发生?

这就是我所拥有的。

void Date::read(istream & is)
    {
        unsigned month;

        is >> month;

        month_ = month;

    }


    istream & operator>>(istream & is, Date & d)
    {
        d.read(is);
        return is;
    }

【问题讨论】:

  • 好吧,其实我不明白为什么你需要一个 Date 参数来表示 IncrementMonth?
  • 这是我要求的一部分。如果我不需要那个日期参数,事情会容易得多。
  • 如果您能澄清incrementMonth 应该做什么,这将有所帮助,因为您不使用该参数。它是否修改参数或*this 或两者兼而有之?在你说d1.incrementMonth(d2, 1) 之后,d1d2 的期望值是多少? (我的猜测是 d2 保持不变,d1 包含将 d2 增加一个月的日期,但这只是猜测。)
  • 对不起。我只是不知道如何实现它并调用它。该函数采用两个参数并递增日期,因此如果日期为 01-01-2000(月-日-年)并且用户将其递增 13 个月,则输出应为 (02-01-2001)。

标签: c++ oop operator-overloading cin istream


【解决方案1】:

重载的输入操作符>>应该被声明为友元:

friend istream & operator>>(istream & is, Date & d);

并在类块之外定义如下:

istream & operator>>(istream & is, Date & d)
{
   is >> d.month_; // input the month only
   d.day_ = d.year_ = 0; 
   return is;
}

对于分配日期和年份的值,分配一些可接受的默认值以使日期对象在接受输入时完整 现在您的日期对象将根据需要从一个值中获取输入。 好吗?

【讨论】:

  • 我理解你的意思,但假设发生的事情是假设日期与默认构造函数日期保持相同,但是当传递月份参数时,假设年份和月份会相应更改。因此,如果日期是 01-01-2000(月-日-年)并且用户将其递增 13 个月,那么输出应该是 (02-01-2001)。我不确定如何将这些参数也传递给 incrementMonth()。谢谢这么快的回复。
  • @mg7 d 参数已经包含这些参数,但它们被称为“成员变量”。
  • @molbdnilo 我对您所指的内容感到困惑。你能再解释一下吗?
【解决方案2】:

怎么样

int increment;
cout << "Enter month increment (0 to exit): " << endl;
cin >> increment;
if (increment == 0) {
   // your special exit stuff
}
d.incrementMonth(increment);

这样你就可以做到:

  1. 按照您的打印评论建议从 0 退出
  2. 去掉incrementMonth方法的第一个参数。 (改用 this 变量。)

【讨论】:

  • 是的,我试过这样做,但我必须使用具有这些确切参数的特定函数。这是我要求的一部分。
【解决方案3】:

我将原始问题解释为:“如何使给定的主要功能工作?”

最小的侵入方式,将是

istream & operator>>(istream & is, Date & d)
{
   int num = 0;
   is >> num;
   d.incrementMonth(d, num);
   return is;
}

虽然我想强调,这个解决方案会导致相当意外的代码(读取对象与读取 int 以递增)。

【讨论】:

  • 这非常有效。这很有趣,因为我尝试了同样的方法并传递了参数 d 和 num 并且它不允许它。我认为将 istream 设置为朋友可以解决这个问题。
  • 不,我没有使用朋友。如果您尝试直接更改_month,您只需成为朋友。
  • 我现在明白了。那么问题可能是什么?错误是我之前尝试执行此操作时未声明方法。
猜你喜欢
  • 2012-09-05
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多