我正在尝试实现一个“整数”类,希望它像内置类型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类型?
答案 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运算符会导致此问题。