c ++重载operator(),用于在动态2D数组中分配值

时间:2014-12-19 22:13:12

标签: c++ c++11 operator-overloading dynamic-memory-allocation

我正在尝试使用overload()运算符将值分配给动态分配的2D数组,这是我的代码 -

class test {
    private:
        int** data ; int row, col ;

    public:
        test(int row = 2, int col = 2)  {
            this->row = row ; this->col = col ;
            this->data = new int*[this->row] ;
            for(int i = 0 ; i < this->row ; i++)
                this->data[i] = new int[this->col] ;
        }

        ~test() {
            for(int i = 0 ; i < this->row ; i++)
                delete [] this->data[i] ;
            delete [] this->data ;
        }

        const int operator() (int row, int col) { // read operation
            return this->data[row][col] ;
        }

        int& operator() (int row, int col) { // write operation
            return this->data[row][col] ;
        }

        // for printing
        friend ostream& operator<< (ostream &os, const test &t);
};

在operator()写操作中,我试图通过引用返回值,以便我可以像这样分配值 -

test t(4,4) ;
t(2,2) = 5 ;

但是它没有编译,说我不能做这样的重载,那么应该用什么来构造t(2,2) = 5类型的语句呢?

2 个答案:

答案 0 :(得分:5)

您的第一次重载必须是以下形式:

int operator() (int row, int col) const

const int operator() (int row, int col)

并且它不是读操作,当您的类型的对象创建为const时使用它,将使用此重载,如果不是const,将使用其他重载,两者都使用阅读和写作。

答案 1 :(得分:3)

您不能拥有仅在返回类型上有所不同的重载。为了获得你想要的效果,添加一个const:

int operator() (int row, int col) const {
    return this->data[row][col];
}

并保持其他重载

int &operator(int row, int col) {
    return this->data[row][col];
}

可以在方法声明的末尾用const重载方法。这样做有以下几点:

  1. 如果创建的对象是const test,则会调用int operator()(int row, int col) const
  2. 如果创建的对象是test(无const),则会调用int &operator(int row, int col)