【发布时间】:2017-06-05 22:24:31
【问题描述】:
我有一个类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 上。因此,如果我取消引用它,它应该可以工作。编译器错误完全正确:
错误:“->”的基本操作数具有非指针类型“Foo”
呃。好吧,对不起这个愚蠢的问题。感谢您的建议。
【问题讨论】:
-
您实际上管理的是对象集合...还是指向对象的指针集合?
-
函数的返回类型没有限制......你在代码中的某个地方犯了一个错误,但如果你不发布你的代码,别人很难回答跨度>
-
您需要将错误添加到您的问题中
-
@Angew:这是一种很好的思考方式。作为答案?
-
@M.M :它确实是一个对象的集合,但它们是由
size_t Foo::add()在内部创建的,它需要足够的参数来构造Bar对象,并将索引返回到构造的对象。我会按照你的要求发布一些代码。
标签: c++ operator-keyword