【问题标题】:Overloading + Operator C++ [duplicate]重载+运算符C++ [重复]
【发布时间】:2014-06-11 01:31:12
【问题描述】:

作为前言,这是作业,我不是在寻找答案,只是一个小小的方向,因为我无法向实验室导师寻求帮助。我的问题是我已经获得了无法更改的预定义类声明。我有 2 个时间对象需要添加以等于第 3 个时间对象。

time3 = time2 + time1;

我的重载函数是这样的

Time Time :: operator + (const Time time2)
{
    Time::addSeconds(time1.second);
    Time::addMinutes(time1.minute);
    Time::addHours(time1.hour); //changes hrs and days

    return *this;
};

所以我在 time1 中添加,在我的 add 函数中,我使用 *this 运算符分配将 time2 转换为 time1 等于的任何值。所以这行不通。如果我可以更改我的类定义,我知道该怎么做,但我不能。我想我的意图是 *this 指的是 time3,但它指的是等式的左侧。

如何在不改变类结构的情况下使我的 add 函数中的结果等于 time3?

我找不到任何资源来显示处理这种情况的正确方法,但如果你有任何资源,我会很乐意通读它们。

【问题讨论】:

  • *this 绝对不是运算符。你应该使用operator+=来实现operator+
  • time1 是从哪里来的?另外,这门课不需要课本吗?
  • 您在询问之前尝试过搜索吗?这是 Stack Overflow 上关于重载运算符的一篇很好的文章:stackoverflow.com/a/4421719/3651800。网上也有不少资料
  • 1.该运算符应该是const。 2.它不应该对对象本身进行操作。 -- 它应该构造一个临时值并返回它。 3. 没有名为time1 的变量。 4. 考虑传递常量引用而不是值传递。
  • 链接的问题有你需要的一切。尤其是 算术运算符 小节 二元算术运算符 下的最佳答案得到了您需要的一切。

标签: c++ overloading operator-keyword


【解决方案1】:

在这个例子中,这是一个平等对待两个对象的二元运算符。这应该作为免费功能来实现。结构如下所示:

Time operator + (const Time &time1, const Time &time2)
{
    Time t3 = time1; 
    t3.addSeconds(time2.second);
    t3.addMinutes(time2.minute);
    t3.addHours(time2.hour);
    //don't know how these functions work...

    return t3;
};

【讨论】:

  • 通常最好不要重复回答,正如原始发帖人所说,他们不是在寻找代码,只是在寻找信息。
  • 要成为独立/非成员函数,您应该从operator+ 中删除Time:: 前缀。 addSeconds et al 函数按照您的假设工作是不合理的,因为例如在t3 = time2.addHours(time1.hour); 中,右侧表达式没有引用方式可以访问现有值 ot t3 以考虑早先的添加。我冒着风险,它需要是operator+(Time time1, const Time& time2) { time1.addSeconds(time2.second); time1.addMinutes(time2.minute); time1.addHours(time2.hour); return time1; } - by-value 参数故意复制。
猜你喜欢
  • 2011-10-27
  • 2012-12-22
  • 2016-09-26
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2016-06-27
  • 2020-01-14
相关资源
最近更新 更多