问题是重载[] []是否可能。C++重载:重载[] []运算符
那么在正常情况下,像矢量< vector < int>>,我们超载了[] opertor。
但在如果定义了一个特殊的意义[] []的情况下,才有可能有这样的运营商
问题是重载[] []是否可能。C++重载:重载[] []运算符
那么在正常情况下,像矢量< vector < int>>,我们超载了[] opertor。
但在如果定义了一个特殊的意义[] []的情况下,才有可能有这样的运营商
没有特殊的[] []运算符;它的运算符[]应用于另一个运算符[]的结果。
通过让第一个操作符返回一个特殊的临时对象,它也有[]操作符,可以为[] []构造赋予特殊的含义。
不,你将不得不超负荷[]
返回本身也[]
超载的值。
有两个操作符。 要做你想做的事情,你必须重载运算符[],它返回对象的向量。
C++中的下标运算符是[]。当你使用像这样的语法“object [] []”时,你要调用operator []来在第一个对象上scubscript,然后在第一个对象上选择第二个操作符[]。
从财务角度看,您不能重载运算符“[] []”,因为该运算符不存在。您应该重载容器对象上的下标操作符,然后在内部对象中重载它。
正如其他人所指出的那样,没有[][]
运营商,这是一个[]
操作者施加在[]
操作的结果。在最一般的 的情况下,第一个[]
运营商将返回代理,该代理实现 本身运营商[]
。在最简单的情况下,“代理” 可以是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->
,并要求 客户端代码使用->
,而不是.
,即使它不是一个真正的 指针,智能或以其他方式。
+1为写作这么多努力,用一个例子来说明。 :-) – Nawaz
顺便说一句,为什么'不可能支持像容器[i] [j] .x'这样的东西?我想我们可以。在你的代码中,不需要'ElementProxy'。相反,如果'RowProxy'定义了一个'value_type row *'成员,那么'operator []'可以简单地做到这一点:'return row [columnIndex];'。通过这种方式,人们可以编写'container [i] [j] .x'。 – Nawaz
@Nawaz如果您使用'value_type *'作为元素代理,则没有问题。但是,假设您正在实现某种稀疏矩阵,其中没有C风格(子)向量形式的完整行。或者你只是想在行和列索引上进行边界检查。一旦你需要元素代理的类类型,你就卡住了; 'operator.'不起作用。 –
没有'[] []'操作符。 – Hobblin
[另一个相关指针](http://stackoverflow.com/a/2216055/179910)。 –