我有一个包含整数数组的类,并获取该数组的引用,下标operator []被重载(这是一个删除了逻辑检查等的精简示例):
class Foo {
public:
Foo() {};
// and overload the [] operator
int& operator[](const int index);
private:
const int LEN = 7;
int arr[LEN];
};
int& Foo::operator[](const int index) {
return arr[index];
}
将此类(名为boo)的实例的指针传递给函数。现在我想做的是:
int val = boo[0];
但它失败了“错误:从'Foo'类型无效转换为'int'类型”。
我的第一个想法是我将一个指针传递给一个类,我应该将一个实例的副本放入范围并使用该副本。这有效。但我很好奇是否可以将用户定义的类型用作真正的内置类型?我应该使用包装吗?
答案 0 :(得分:3)
因为重载的运算符是为对象定义的,而不是指向对象的指针。有两种选择:
int val = boo->operator[](0);
或
int val = (*boo)[0];
或者您可以传递对象(通过值或引用)而不是指向它的指针。
您的情况相当于:
Boo* b = ....;
b[0]; //this returns a Boo object
而不是:
Boo b;
b[0]; //calls operator[]
答案 1 :(得分:3)
您需要使用:
boo->operator[] ( 0 );
或
(*boo)[0];
即。取消引用指向对象boo的指针。