Я создаю класс-оболочку для одного указателя, который действует как двумерный массив.У меня есть перегруженный оператор () для возврата значения из массива.
Я хочу иметь возможность использовать оператор () для доступа к значениям массива в форме arr (r, c)
#include <iostream>
#include <cstring>
using namespace std;
template <class T>
class TwoDArray
{
private:
T * arr;
int rows, columns, size;
int getIndex(int r, int c)
{
int index = (r*columns) + c;
return index;
}
public:
/*Constructor*/
TwoDArray(int r = 1, int c = 1) : rows(r), columns(c)
{
if(r > 0 && c > 0)
{
size = rows*columns;
arr = new T [size];
memset(arr, 0, sizeof(int)*size);
}
else
{
arr = NULL;
}
}
void setAtIndex(int r, int c, T value)
{
int index = getIndex(r, c);
arr[index] = value;
}
//lvalue - has the effect obj(r,c);
T& operator()(unsigned int r, unsigned int c)
{
if(r >= rows || c >= columns)
{
cerr<<"Unable to locate memory\n";
exit(0);
}
return arr[getIndex(r,c)];
}
//rvalue - has the effect obj(r,c);
const T& operator()(unsigned int r, unsigned int c) const
{
if(r >= rows || c >= columns)
{
cerr<<"Unable to locate memory\n";
exit(0);
}
return arr[getIndex(r,c)];
}
void displayTwoD() const
{
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < columns; ++j)
{
cout<<this->arr(i,j);
}
cout<<"\n";
}
}
/*Destructor*/
~TwoDArray()
{
if(arr != NULL)
delete arr;
arr = NULL;
}
};
int main()
{
TwoDArray <int> tda(5,5);
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
tda.setAtIndex(i,j, (i+1)*2);
}
}
tda.displayTwoD();
return 0;
}
Я получаю ошибку:
G:\DS>g++ checkError.cpp
checkError.cpp: In instantiation of 'void TwoDArray<T>::displayTwoD() const [with T = int]':
checkError.cpp:95:18: required from here
checkError.cpp:68:10: error: expression cannot be used as a function
cout<<this->arr(i,j);
, когда я использую
cout<<arr(i,j);
в любом месте кода.Я хочу знать, почему это происходит и как это решить.