返回类型的数组访问运算符重载

时间:2017-06-05 13:46:01

标签: c++ operator-keyword

我有一个类Foo来管理另一个类Bar的对象集合。管理类有一个方法Bar *Foo::at( int index )来访问集合中的对象,所以我可以做myfoo->at(2)->barmethod()之类的事情。现在我想知道我是否可以重载Foo::operator[]来返回Bar*,所以我可以改为myfoo[2]->barmethod()。编译器并不喜欢这样。运算符的返回类型是否必须是对其所属类的引用?

这是一些代码。第一部作品,第二作品没有。

Foo::Bar *Foo::at( size_t index )
{
    return index < m_count ? m_entry[index] : 0;
}

Foo::Bar *Foo::operator[]( size_t index )
{
    return index < m_count ? m_entry[index] : 0;
}

从标题:

class Foo
{
public:

    class Bar
    {
    ...
    };

    size_t add( UINT8 addr, UINT8 type, UINT8 opt, UINT8 rev );
    Bar    *at( size_t index );
    Bar    *operator[]( size_t index );
    ....

protected:

    Bar             **m_entry;      // array of entry pointers
    size_t          m_size;
    size_t          m_count;

};

这里是编译器不喜欢的代码(当使用[]时):

Foo *myfoo;
...
myfoo[i]->barmethod();

现在写这篇文章我看到了问题所在。我在指针[]上使用Foo,而不是实际Foo。因此,如果我取消引用它,它应该工作。编译器错误完全正确:

错误:&#39; - &gt;&#39;的基本操作数有非指针类型&#39; Foo&#39;

咄。好的,抱歉这个愚蠢的问题。谢谢你的建议。

2 个答案:

答案 0 :(得分:4)

  

运算符的返回类型是否必须是对其所属类的引用?

你可以通过思考,例如,自己轻易回答这个问题。 std::vector,其operator [],以及后者的返回类型。

结论是没有这样的限制。 operator[]的唯一限制是:

  • 必须只有一个参数。
  • 必须将其定义为成员函数(它不能是命名空间范围函数)。

答案 1 :(得分:3)

没有。当重载operator[]时,你唯一不能改变的是它的 arity :也就是说,你不能改变参数的数量。

但您可以更改参数的类型(尽管std::size_t很常见),您也可以更改返回类型。 (虽然const Bar&const的{​​{1}}重载很常见,[]对于非Bar&重载很常见。