与运算符[]一起使用类

时间:2019-05-03 07:37:29

标签: c++ class operator-overloading

我正在尝试实现一个“整数”类,希望它像内置类型oStubSomeFunction = sinon.stub(obj, "someFunction")一样工作。但是我遇到了一个问题:我无法像int那样在运算符[]中使用此类,请参见下面的代码:

int

有什么方法(不包括强制转换运算符)可以使运算符#include <iostream> using namespace std; class Integer { private: int Value; public: Integer(int x = 0) { Value = x; } void SetValue(int x) { Value = x; } int GetValue() { return Value; } Integer& operator [] (Integer X); }; Integer& Integer::operator [] (Integer X) { // Code } int main() { Integer X[10]; Integer I(5); int i = 5; for(int i=0; i<10; ++i) X[i].SetValue(i+1); cout << X[i].GetValue() << endl; // It still work cout << X[I].GetValue() << endl; // Doesn't work return 0; } []那样理解我的Integer类型?

4 个答案:

答案 0 :(得分:5)

您正在考虑错误的解决方法。您不需要在自己的类上重载[]运算符,实际上您需要将类转换为int,这可以通过重载强制转换运算符来实现。

class Integer
{
public:
  operator int () const { return Value; }
};

答案 1 :(得分:3)

这里有些混乱。类型为T array 的声明形式为

T t[n];

其中n是数组大小的编译时可评估常量表达式。

不会调用[]中定义的任何T运算符,对于整数类型的后续表达式表达式t[i]对元素的后续访问也不会i

如果在您的情况下,您希望X[I]是可编译的,那么您需要提供一个允许将I视为数组索引的运算符(更正式的语言要求原始的整型)。

是对int的强制转换运算符
operator int() const
{
    return Value;
}

是实施方案。

答案 2 :(得分:2)

您需要将类型转换运算符添加到类中。这样可以将您的类转换为兼容类型。有关更多信息,请参见此处:http://www.cplusplus.com/doc/tutorial/typecasting/

此函数应该为您的课堂做窍门。

operator int() const { return GetValue(); }

答案 3 :(得分:0)

实际上,您不需要重载[]运算符。 您只需要确保可以使用int int运算符将Integer转换为int。

类似的方法会更好。

operator int() const
{ return GetValue(); }

然后,您还应该小心打印。

X[i].GetValue()是错误的,因为在您的示例中i = 10。这将导致执行错误。

X[I].GetValue()在您的示例中是错误的,因为如果没有I.getValue(),则无法在类和int之间进行逆转换。我很惊讶这不会导致编译错误,但是重载int运算符会导致此问题。