我正在尝试使用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
类型的语句呢?
答案 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
重载方法。这样做有以下几点:
const test
,则会调用int operator()(int row, int col) const
test
(无const
),则会调用int &operator(int row, int col)