0

我有一个包含整数数组的类,并且为了获得该数组的引用,下标运算符 [] 被重载(这是一个删除了逻辑检查等的精简示例):

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'类型的无效转换”。

我的第一个想法是我传递一个指向类的指针,我应该将实例的副本带入范围并使用该副本。这行得通。但是我很好奇是否可以将用户定义的类型用作真正的内置类型?我应该使用包装器吗?

4

2 回答 2

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[]
于 2012-10-29T12:08:36.387 回答
3

您需要使用:

boo->operator[] ( 0 );

或者

(*boo)[0];

IE 取消引用指向对象 boo 的指针。

于 2012-10-29T12:08:58.693 回答