2010-03-28 80 views
8

我想重载operator[][]给内部访问C++二维字符数组。运算符[] [] C++

现在,我只有超载operator[],肚里像

class Object 
{ 
    char ** charMap ; 
    char* operator[](int row) 
    { 
     return charMap[row] ; 
    } 
} ; 

它的工作原理确定..是否有可能重写operator[][]虽然?

+8

C++中没有运算符[] []。 – 2010-03-28 14:31:02

+1

重载超载[] OH返回的数组SHI- – 2010-03-28 14:35:37

回答

18

不要试图这样做 - 正如其他人所说的那样,超载operator []您的方式实际上提供了免费的[][]语法。但这不是一件好事。

恰恰相反 - 它通过将实现细节 - 指针 - 指向外部来破坏封装和信息隐藏。一般来说,这是不可取的。

一个更好的方法是实现一个operator [,],它需要多个参数,或者确实需要一个operator [][]。但在C++中都不存在。

所以通常这样做的方法是一齐沟operator []超过一个维度。干净的替代方案是使用operator(),而不是因为运营商可以有不止一个参数:

class Object 
{ 
    char ** charMap ; 
    char& operator()(int row, int column) 
    { 
     return charMap[row][column]; 
    } 
}; 

欲了解更多信息,请参阅C++ FAQ Lite文章。

+2

用于提示'operator()' – missingfaktor 2010-03-28 14:55:21

+2

您的答案引出了一些好的观点,但支持operator []不需要销毁封装 - 而不是返回指针,您可以返回支持operator []的代理对象,而无需揭露任何内部。 – 2010-03-28 15:44:06

+0

@Jerry:true,但代理对象的工作量大大增加,对于多维对象(当然,对于*锯齿*数组,它非常有意义),任何好处都是值得怀疑的。 – 2010-03-28 16:49:55

5

没有operator[][]。先评估a[x][y]operator[]a,然后再operator[]的结果。

因此,您的对象的operator[]必须返回另一个具有自己的operator[]的对象,然后该对象将访问请求的值。

2

据我所知,没有operator[][]这样的东西。你可以做的是你可以从你的operator[]方法返回的东西超载operator[]

其实你现在正在这样做,因为你返回char*可以再次使用[]索引。

17

没有运营商[][]:这是两个[]连续的操作。你可以:

  • 有无Object::operator[]返回代表一行,它有自己的operator[]方法采用列号的第二类的对象;
  • 编写一个get(int row, int column)方法并使用它来代替运算符重载。我会推荐这个,除非你的对象必须像数组一样行为。
+4

+1如果您的类不打算像函数那样工作,请将operator()单独留下。 – 2010-06-21 08:39:22

0

运营商没有[][]。实际上发生的是第二个[]对由第一个[]返回的变量进行操作。因为已经有了这个功能,如果存在一个[][]运算符,会产生歧义。


例如:假设您有一个类型为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中已经提到)是使用不同的操作员,如()

+0

模糊可以很容易解决,例如,通过使用贪婪的解析。此外,你的第一个代码包含一个错误,因为'new'返回一个*指针*。 – 2010-03-28 16:51:48