operator [] [] C++

bob*_*obo 8 c++ operator-overloading

我想重载operator[][]以在C++中内部访问二维char数组.

现在我只是超载operator[],这就像是

class Object
{
    char ** charMap ;
    char* operator[]( int row )
    {
        return charMap[row] ;
    }
} ;
Run Code Online (Sandbox Code Playgroud)

它工作正常.. operator[][]虽然可以覆盖吗?

Kon*_*lph 18

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

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

一个更好的方法是实现一个operator [,]多于一个参数,或者实际上是一个operator [][].但是在C++中都不存在.

所以通常的做法是operator []完全放弃多个维度.干净的替代方法是使用,operator ()因为该运算符可以有多个参数:

class Object
{
    char ** charMap ;
    char& operator ()(int row, int column)
    {
        return charMap[row][column];
    }
};
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅C++ FAQ Lite中的文章.

  • 你的答案提出了一些好处,但支持operator []不需要破坏封装 - 而不是返回一个指针,你可以返回一个支持operator []的代理对象而不暴露任何内部. (2认同)

rjh*_*rjh 17

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

  • Object::operator[]返回一个表示一排,它有自己的一个第二类的对象operator[]方法,该方法采用列数;
  • 编写一个get(int row, int column)方法并使用它而不是运算符重载.我推荐这个,除非你的对象绝对必须像数组一样.

  • +1如果您的类不打算像函数一样运行,请单独使用operator(). (4认同)

sth*_*sth 5

没有operator[][].评估a[x][y]首先调用operator[]a,然后operator[]再对这个结果.

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