Я пишу матричный класс и дважды перегрузил оператор вызова функции. Ядро матрицы представляет собой двумерный двойной массив. Я использую компилятор MinGW GCC, вызываемый из консоли Windows.
Первая перегрузка предназначена для возврата двойного из массива (для просмотра элемента).
вторая перегрузка предназначена для возврата ссылки на местоположение в массиве (для изменения данных в этом месте.
double operator()(int row, int col) const ; //allows view of element
double &operator()(int row, int col); //allows assignment of element
Я пишу процедуру тестирования и обнаружил, что перегрузка «просмотра» никогда не вызывается. по какой-то причине компилятор "по умолчанию" вызывает перегрузку, которая возвращает ссылку, когда используется следующий оператор printf ().
fprintf(outp, "%6.2f\t", testMatD(i,j));
Я понимаю, что оскорбляю богов, пишу свой собственный класс матрицы без использования векторов и проверяю их с помощью функций ввода / вывода C. Я буду наказан полностью в загробной жизни, нет необходимости делать это здесь.
В конечном счете, я хотел бы знать, что здесь происходит и как это исправить. Я бы предпочел использовать более чистые операторские перегрузки, а не функции-члены.
Есть идеи?
Класс матрицы: нерелевантный код опущен.
class Matrix
{
public:
double getElement(int row, int col)const; //returns the element at row,col
//operator overloads
double operator()(int row, int col) const ; //allows view of element
double &operator()(int row, int col); //allows assignment of element
private:
//data members
double **array; //pointer to data array
};
double Matrix::getElement(int row, int col)const{
//transform indices into true coordinates (from sorted coordinates
//only row needs to be transformed (user can only sort by row)
row = sortedArray[row];
result = array[usrZeroRow+row][usrZeroCol+col];
return result;
}
//operator overloads
double Matrix::operator()(int row, int col) const {
//this overload is used when viewing an element
return getElement(row,col);
}
double &Matrix::operator()(int row, int col){
//this overload is used when placing an element
return array[row+usrZeroRow][col+usrZeroCol];
}
Программа тестирования: нерелевантный код опущен.
int main(void){
FILE *outp;
outp = fopen("test_output.txt", "w+");
Matrix testMatD(5,7); //construct 5x7 matrix
//some initializations omitted
fprintf(outp, "%6.2f\t", testMatD(i,j)); //calls the wrong overload
}