2011-08-16 234 views
4

问题是重载[] []是否可能。C++重载:重载[] []运算符

那么在正常情况下,像矢量< vector < int>>,我们超载了[] opertor。

但在如果定义了一个特殊的意义[] []的情况下,才有可能有这样的运营商

+9

没有'[] []'操作符。 – Hobblin

+0

[另一个相关指针](http://stackoverflow.com/a/2216055/179910)。 –

回答

15

没有特殊的[] []运算符;它的运算符[]应用于另一个运算符[]的结果。

通过让第一个操作符返回一个特殊的临时对象,它也有[]操作符,可以为[] []构造赋予特殊的含义。

11

不,你将不得不超负荷[]返回本身也[]超载的值。

1

有两个操作符。 要做你想做的事情,你必须重载运算符[],它返回对象的向量。

0

C++中的下标运算符是[]。当你使用像这样的语法“object [] []”时,你要调用operator []来在第一个对象上scubscript,然后在第一个对象上选择第二个操作符[]。

从财务角度看,您不能重载运算符“[] []”,因为该运算符不存在。您应该重载容器对象上的下标操作符,然后在内部对象中重载它。

3

正如其他人所指出的那样,没有[][]运营商,这是一个[] 操作者施加在[]操作的结果。在最一般的 的情况下,第一个[]运营商将返回代理,该代理实现 本身运营商[]。在最简单的情况下,“代理” 可以是T*,因为在C++中,指针实现了[]运算符。 A 更通用的实现方式可能与此类似:

class ElementProxy 
{ 
    Container* myOwner; 
    int myRowIndex; 
    int myColumnIndex; 
public: 
    ElementProxy(Container* owner, int rowIndex, int columnIndex) 
     : myOwner(owner) 
     , myRowIndex(rowIndex) 
     , myColumnIndex(columnIndex) 
    { 
    } 

    operator Type() const // lvalue to rvalue conversion 
    { 
     return myOwner->get(myRowIndex, myColumnIndex); 
    } 

    void operator=(Type const& rhs) const 
    { 
     myOwner->set(myRowIndex, myColumnIndex, rhs); 
    } 
}; 

class RowProxy 
{ 
public: 
    RowProxy(Container* owner, int rowIndex) 
     : myOwner(owner) 
     , myRowIndex(rowIndex) 
    { 
    } 
    ElementProxy operator[](int columnIndex) const 
    { 
     return ElementProxy(myOwner, myRowIndex, columnIndex); 
    } 
}; 

这并不完美;如果你正在处理班级类型,例如 不可能支持container[i][j].x行;我们不能 超载operator.。如果您需要支持这一点,你 能做的最好是在ElementProxy超载operator->,并要求 客户端代码使用->,而不是.,即使它不是一个真正的 指针,智能或以其他方式。

+0

+1为写作这么多努力,用一个例子来说明。 :-) – Nawaz

+0

顺便说一句,为什么'不可能支持像容器[i] [j] .x'这样的东西?我想我们可以。在你的代码中,不需要'ElementProxy'。相反,如果'RowProxy'定义了一个'value_type row *'成员,那么'operator []'可以简单地做到这一点:'return row [columnIndex];'。通过这种方式,人们可以编写'container [i] [j] .x'。 – Nawaz

+0

@Nawaz如果您使用'value_type *'作为元素代理,则没有问题。但是,假设您正在实现某种稀疏矩阵,其中没有C风格(子)向量形式的完整行。或者你只是想在行和列索引上进行边界检查。一旦你需要元素代理的类类型,你就卡住了; 'operator.'不起作用。 –