我想重载operator[][]
给内部访问C++二维字符数组。运算符[] [] C++
现在,我只有超载operator[]
,肚里像
class Object
{
char ** charMap ;
char* operator[](int row)
{
return charMap[row] ;
}
} ;
它的工作原理确定..是否有可能重写operator[][]
虽然?
我想重载operator[][]
给内部访问C++二维字符数组。运算符[] [] C++
现在,我只有超载operator[]
,肚里像
class Object
{
char ** charMap ;
char* operator[](int row)
{
return charMap[row] ;
}
} ;
它的工作原理确定..是否有可能重写operator[][]
虽然?
不要试图这样做 - 正如其他人所说的那样,超载operator []
您的方式实际上提供了免费的[][]
语法。但这不是一件好事。
恰恰相反 - 它通过将实现细节 - 指针 - 指向外部来破坏封装和信息隐藏。一般来说,这是不可取的。
一个更好的方法是实现一个operator [,]
,它需要多个参数,或者确实需要一个operator [][]
。但在C++中都不存在。
所以通常这样做的方法是一齐沟operator []
超过一个维度。干净的替代方案是使用operator()
,而不是因为运营商可以有不止一个参数:
class Object
{
char ** charMap ;
char& operator()(int row, int column)
{
return charMap[row][column];
}
};
欲了解更多信息,请参阅C++ FAQ Lite文章。
用于提示'operator()' – missingfaktor 2010-03-28 14:55:21
您的答案引出了一些好的观点,但支持operator []不需要销毁封装 - 而不是返回指针,您可以返回支持operator []的代理对象,而无需揭露任何内部。 – 2010-03-28 15:44:06
@Jerry:true,但代理对象的工作量大大增加,对于多维对象(当然,对于*锯齿*数组,它非常有意义),任何好处都是值得怀疑的。 – 2010-03-28 16:49:55
没有operator[][]
。先评估a[x][y]
先operator[]
a
,然后再operator[]
的结果。
因此,您的对象的operator[]
必须返回另一个具有自己的operator[]
的对象,然后该对象将访问请求的值。
据我所知,没有operator[][]
这样的东西。你可以做的是你可以从你的operator[]
方法返回的东西超载operator[]
。
其实你现在正在这样做,因为你返回char*
可以再次使用[]
索引。
没有运营商[][]
:这是两个[]
连续的操作。你可以:
Object::operator[]
返回代表一行,它有自己的operator[]
方法采用列号的第二类的对象;get(int row, int column)
方法并使用它来代替运算符重载。我会推荐这个,除非你的对象必须像数组一样行为。+1如果您的类不打算像函数那样工作,请将operator()单独留下。 – 2010-06-21 08:39:22
运营商没有[][]
。实际上发生的是第二个[]
对由第一个[]
返回的变量进行操作。因为已经有了这个功能,如果存在一个[][]
运算符,会产生歧义。
例如:假设您有一个类型为T
的变量x
。
T x = new T();
如果我们使用[]
运营商,我们说的是返回的其他类型Q
的变量:
Q y = x[0];
,然后使用上Q
类型的变量[]
运营商可能会返回类型的变量R
:
R z = y[0];
因此x[][]
返回变量t YPE R.
比方说,我们实际上能够超载[][]
类型T,使得它返回一个类型S:
S a = x[0][0];
编译器就没有办法知道是否应该对使用[][]
操作x
返回一个类型S
变量,或连续两次使用[]
运算符返回一个类型R
变量。这是我上面提到的含糊之处。
你最好的选择,如果你坚持使用方括号是有operator[]
返回一个变量,它也有[]
重载(或者同一类型的变量,具有标志设置),并有最初返回第二个[]
的可变交易。
但是,这里的最佳解决方案(如another answer中已经提到)是使用不同的操作员,如()
。
模糊可以很容易解决,例如,通过使用贪婪的解析。此外,你的第一个代码包含一个错误,因为'new'返回一个*指针*。 – 2010-03-28 16:51:48
C++中没有运算符[] []。 – 2010-03-28 14:31:02
重载超载[] OH返回的数组SHI- – 2010-03-28 14:35:37