我在班级间隔中重载[]运算符以返回分钟或秒。
但我不知道如何使用[]运算符将值分配给分钟或秒。
例如:我可以使用这个陈述
cout << a[1] << "min and " << a[0] << "sec" << endl;
但是我想重载[]运算符,这样我甚至可以使用
将值分配给分钟或秒a[1] = 5;
a[0] = 10;
我的代码:
#include <iostream>
using namespace std;
class Interval
{
public:
long minutes;
long seconds;
Interval(long m, long s)
{
minutes = m + s / 60;
seconds = s % 60;
}
void Print() const
{
cout << minutes << ':' << seconds << endl;
}
long operator[](int index) const
{
if(index == 0)
return seconds;
return minutes;
}
};
int main(void)
{
Interval a(5, 75);
a.Print();
cout << endl;
cout << a[1] << "min and " << a[0] << "sec" << endl;
cout << endl;
}
我知道我必须将成员变量声明为私有,但为了方便起见,我在此声明为公开。
答案 0 :(得分:11)
返回对相关成员的引用,而不是其值:
long &operator[](int index)
{
if (index == 0)
return seconds;
else
return minutes;
}
答案 1 :(得分:8)
通过删除const
并返回引用来更改函数签名:
long& operator[](int index)
现在您可以编写如下语句:
a[0] = 12;
答案 2 :(得分:6)
重载op []以使用硬编码的“索引”值在这里没有意义,实际上你已经在类定义中有了解决方案:
cout << a.minutes << "min and " << a.seconds << "sec" << endl;
您可以将这些转换为方法而不是公共数据成员,这对于不重载op []是无关紧要的。但是,由于您还需要写访问权限,因此方法的唯一优势是验证(例如,检查0&lt; =秒&lt; 60)。
struct Interval {
int minutes() const { return _minutes; }
void minutes(int n) { _minutes = n; } // allows negative values, etc.
int seconds() const { return _seconds; }
void seconds(int n) {
if (0 <= n and n < 60) {
_seconds = n;
}
else {
throw std::logic_error("invalid seconds value");
}
}
// rest of class definition much like you have it
private:
int _minutes, _seconds;
};
// ...
cout << a.minutes() << "min and " << a.seconds() << "sec" << endl;
答案 3 :(得分:3)
通过引用返回能够分配值并在赋值运算符的LHS上使用它们。
答案 4 :(得分:3)
将方法转换为下面给出的方法应该这样做:
long& operator[](int index)
答案 5 :(得分:1)
您的数组索引成员运算符应以
的形式提供long& operator[](int index); // for non const object expressions
long const& operator[](int index) const; // for const object expressions
答案 6 :(得分:1)
为了避免在重载子脚本运算符的情况下出现混淆,建议使用子脚本运算符的const
和non-const
版本。
long& operator[](int index); // non-const function returning reference
long const& operator[](int index) const;// const function returning const reference
使用A[1] = 5
,您正尝试修改index 1
处的对象。因此,将自动调用子脚本运算符的非const版本。
使用cout << A[1]
,您不会在index 1
修改对象。因此,将自动调用子脚本运算符的const版本。