【问题标题】:Return type of array access operator overload数组访问运算符重载的返回类型
【发布时间】: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


【解决方案1】:

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

你可以自己简单地回答这个问题,例如思考一下。 std::vector,它的operator [],以及后者的返回类型。

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

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

【讨论】:

  • 不错。有一个vpvote。第二个项目符号属于 pub quiz 类别。
【解决方案2】:

没有。重载operator[]时唯一不能改变的是它的arity:即不能改变参数的个数。

但是你可以改变参数的type(虽然std::size_t很常见),你也可以改变返回类型。 (虽然const Bar&amp; 常见于[]const 过载,而Bar&amp; 常见于非const 过载)。

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多