Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运算符[][]C++; >我想重载运算符[][]/COD>以获得对C++中的char的2D数组的内部访问。_C++_Operator Overloading - Fatal编程技术网

运算符[][]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如果您的类不打算像函数一样运行,请不要使用操作符()。