我有一个类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;
咄。好的,抱歉这个愚蠢的问题。谢谢你的建议。
答案 0 :(得分:4)
运算符的返回类型是否必须是对其所属类的引用?
你可以通过思考,例如,自己轻易回答这个问题。 std::vector
,其operator []
,以及后者的返回类型。
结论是没有这样的限制。 operator[]
的唯一限制是:
答案 1 :(得分:3)
没有。当重载operator[]
时,你唯一不能改变的是它的 arity :也就是说,你不能改变参数的数量。
但您可以更改参数的类型(尽管std::size_t
很常见),您也可以更改返回类型。 (虽然const Bar&
对const
的{{1}}重载很常见,[]
对于非Bar&
重载很常见。