0

我有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' 没有重载成员 'operator ->'

错误 C2039:“some_field_from_A”:不是“B”的成员

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

我正在使用 Visual Studio 2012。

4

1 回答 1

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}

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

于 2012-12-27T11:06:41.653 回答