数组运算符重载

时间:2012-12-27 10:58:20

标签: c++ operator-overloading

我有A级和B级。

A类有一些字段。 B类就像:

class B {
public:
    A* operator[]( int id ) {
        return m_field.at( id );
    }
    /* also tried this one, but there are the same errors
    A*& operator[]( int id ) {
        return m_field.at( id );
    }
    */
private:
    vector<A*> m_field;
};

为什么我在执行时遇到错误:

B* B_instance = new B();
B_instance[some_int]->some_field_from_A;

错误是:

  

错误C2819:类型'B'没有重载成员'运算符 - &gt;'

     

错误C2039:'some_field_from_A':不是'B'的成员

为什么我需要 - &gt;运算符重载以及它应该是什么样子?这对我没有意义。

我正在使用Visual Studio 2012。

1 个答案:

答案 0 :(得分:4)

索引运算符适用于B类型的某些内容,而不适用于B *类型的内容。因此,要使用索引运算符,首先需要取消引用指针(或者根本不使用指针):

(*B_instance)[some_int]...

错误的原因是因为指针可以被索引,因为它们能够表示数组,如下例所示:

int arr[2] = {0, 1};
int *p = arr; //array to pointer conversion
p[1] = 2; // now arr is {0, 2}

因此,当您索引B *时,它会返回一个B,它最有可能超出您想象的数组的范围。然后,当它需要点运算符时,在B对象上使用箭头运算符。无论哪种方式,如果你使用指针,取消引用它,然后索引它,然后使用箭头。