【发布时间】:2011-10-27 22:10:46
【问题描述】:
问题是是否可以重载 [ ][ ] 。
在像vector> 这样的正常情况下,我们正在重载[ ] 操作符。
但是如果为 [ ][ ] 定义特殊含义,是否可以有这样的运算符
【问题讨论】:
-
没有
[][]运算符。
标签: c++ overloading
问题是是否可以重载 [ ][ ] 。
在像vector> 这样的正常情况下,我们正在重载[ ] 操作符。
但是如果为 [ ][ ] 定义特殊含义,是否可以有这样的运算符
【问题讨论】:
[][] 运算符。
标签: c++ overloading
没有特殊的 [][] 运算符;它的 operator[] 应用于另一个 operator [] 的结果。
您可以通过让第一个运算符返回一个特殊的临时对象来赋予 [][] 构造特殊的含义,该对象也具有 [] 运算符。
【讨论】:
不,您必须重载 [] 才能返回一个本身已重载 [] 的值。
【讨论】:
正如其他人指出的那样,没有[][] 运算符,它是[]
运算符应用于 [] 运算符的结果。在最一般的
情况下,第一个 [] 运算符将返回一个代理,它实现
本身是[] 运算符。在最简单的情况下,“代理”
可以是T*,因为在 C++ 中,指针实现了[] 运算符。一种
更通用的实现可能是这样的:
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->,并要求
使用-> 而不是. 的客户端代码,即使它不是真正的
指针,智能或其他。
【讨论】:
impossible to support something like container[i][j].x?我认为我们可以。在您的代码中,不需要ElementProxy。相反,如果RowProxy 定义了一个成员value_type row*,那么operator[] 可以简单地这样做:return row[columnIndex];。这样就可以写container[i][j].x.
value_type* 作为元素代理,则没有问题。但是,假设您正在实现某种稀疏矩阵,其中没有 C 样式(子)向量形式的完整行。或者只是您想要对行和列索引进行边界检查的地方。一旦您需要元素代理的类类型,您就会陷入困境; operator. 不起作用。
value_type,并相应地工作。
RowProxy 不会返回ElementProxy,而是立即调用myOwner->get(...)。如果这个函数返回一个引用,而operator[]也返回一个引用,应该没有问题。然而,在很多情况下,元素不一定存在于内存中,您需要ElementProxy。
有两个运算符。 要执行您想要的操作,您必须重载返回对象向量的 operator[]。
【讨论】:
c++中的下标运算符是[]。当您使用类似“object[][]”这样的语法时,您正在调用运算符 [] 来为第一个对象创建脚本,然后在第一个对象选择的对象上调用第二个运算符 []。
基本上你不能重载操作符“[][]”,因为这个操作符不存在。您应该在容器对象上重载下标运算符,然后在内部对象中也重载它。
【讨论】: