运算符[][]C++; >我想重载运算符[][]/COD>以获得对C++中的char的2D数组的内部访问。
现在我只重载了运算符[][]C++; >我想重载运算符[][]/COD>以获得对C++中的char的2D数组的内部访问。,c++,operator-overloading,C++,Operator Overloading,现在我只重载了操作符[],这类似于 class Object { char ** charMap ; char* operator[]( int row ) { return charMap[row] ; } } ; 没问题。。但是是否可以覆盖运算符[]【】?没有运算符[]【】【】。计算a[x][y]首先调用a上的operator[],然后再次调用operator[] 因此,对象的操作符[]必须返回另一个对象及其自己的操作符[],然后该对象将访问
操作符[]
,这类似于
class Object
{
char ** charMap ;
char* operator[]( int row )
{
return charMap[row] ;
}
} ;
没问题。。但是是否可以覆盖
运算符[]【】
?没有运算符[]【】【】
。计算a[x][y]
首先调用a
上的operator[]
,然后再次调用operator[]
因此,对象的
操作符[]
必须返回另一个对象及其自己的操作符[]
,然后该对象将访问请求的值。据我所知,没有操作符[]
这样的东西。您可以做的是,您可以从操作符[]
方法返回一些重载了操作符[]
的内容
实际上,您现在正在这样做,因为您返回了
char*
,可以再次使用[]
对其进行索引。没有运算符[][]
:这是一行中的两个[]
操作。你可以:
- Have
返回表示行的第二类对象,该对象有自己的Object::operator[]
方法,该方法采用列号李>operator[]
- 编写一个
方法,并使用该方法代替运算符重载。我建议这样做,除非您的对象绝对必须像数组一样工作get(int行,int列)
操作符[]
实际上是免费提供[]]
语法的。但这不是一件好事
相反,它通过将实现细节char*
指针指向外部,破坏了类的封装和信息隐藏。一般来说,这是不可取的
更好的方法是实现一个接受多个参数的运算符[,]
,或者实际上是一个运算符[][]
。但C++中也不存在。
因此,通常的方法是将操作符[]
一起丢弃多个维度。干净的替代方法是使用运算符()
,因为该运算符可以有多个参数:
class Object
{
char ** charMap ;
char& operator ()(int row, int column)
{
return charMap[row][column];
}
};
有关更多信息,请参阅。没有
[]]
运算符中的文章。实际上,第二个[]
对第一个[]
返回的变量进行操作。由于已经存在该功能,如果存在[]]
运算符,则会产生歧义
例如:假设您有一个类型为
T
的变量x
T x = new T();
如果我们使用[]
运算符,则假定返回另一类型的Q
变量:
Q y = x[0];
然后对Q
类型的变量使用[]
运算符可能会返回R
类型的变量:
R z = y[0];
因此,x[][]
返回一个t类型的变量R
假设我们实际上能够为类型T重载[][]
,从而返回类型s:
S a = x[0][0];
编译器无法知道是否应该使用x
上的[]]
运算符返回类型S
变量,或者连续使用[]
运算符两次返回类型R
变量。这就是我上面提到的模糊性
如果你坚持使用方括号,最好的办法是让
操作符[]
返回一个也重载了[]
的变量(或者可能是一个具有标志集的相同类型的变量),并让最初返回的变量处理第二个[]
最好的解决方案是使用一个不同的操作符,如<代码>() .< /P> C++中没有操作符[]]。重载过载的数组[] OHSH,你的答案提出了一些好的点,但是支持运算符[]不需要破坏封装——而不是返回指针,您可以返回一个支持运算符[]的代理对象,而不暴露任何内部内容。@Jerry:是的,但是代理对象的工作量要大得多,而且对于多维对象来说,任何好处都是值得怀疑的(当然,对于锯齿数组来说,这是非常有意义的)。代理的工作量更大,但我认为“很大”有点言过其实——代理大约有六行代码(尽管对于N维,您需要N-1个代理类,因此对于超过3D的对象,您通常需要编写一个模板)。这种歧义可以很容易地解决,例如,使用贪婪解析。另外,您的第一个代码包含一个错误,因为
new
返回一个指针。+1如果您的类不打算像函数一样运行,请不要使用操作符()。