Código:
In file included from multiplicacion_matriz.cpp:1:0:
Matriz.cpp: In copy constructor ‘Matriz::Matriz(const Matriz&)’:
Matriz.cpp:54:37: error: passing ‘const Matriz’ as ‘this’ argument of ‘const int Matriz::consultar_filas()’ discards qualifiers [-fpermissive]
Matriz.cpp:55:43: error: passing ‘const Matriz’ as ‘this’ argument of ‘const int Matriz::consultar_columnas()’ discards qualifiers [-fpermissive]
Matriz.cpp:68:38: error: passing ‘const Matriz’ as ‘this’ argument of ‘const int Matriz::consultar(int, int)’ discards qualifiers [-fpermissive]
Matriz.cpp: In member function ‘void Matriz::sumar(const Matriz&)’:
Matriz.cpp:101:72: error: passing ‘const Matriz’ as ‘this’ argument of ‘const int Matriz::consultar(int, int)’ discards qualifiers [-fpermissive]
Matriz.cpp: In member function ‘void Matriz::multiplicar(const Matriz&, int)’:
Matriz.cpp:111:75: error: passing ‘const Matriz’ as ‘this’ argument of ‘const int Matriz::consultar(int, int)’ discards qualifiers [-fpermissive]
Y el código de la clase en la que salta el error es este:
Código
#include <iostream> #include <vector> using namespace std; class Matriz { private: int filas; int columnas; int **matr; public: //Constructora Matriz(int filas, int columnas); //Constructora-copiadora Matriz(const Matriz &mat); //Destructora ~Matriz(); //Consultoras const int consultar_filas(); const int consultar_columnas(); const int consultar(int fila, int columna); //Modificadora void modificar(int fila, int columna, int x); void sumar(const Matriz &mat); void multiplicar(const Matriz &mat, int pos); //Entrada / Sortida void leer(); void escribir(); }; Matriz::Matriz(int filas, int columnas) { this->filas = filas; this->columnas = columnas; matr = new int* [filas]; for (int i = 0; i < filas; ++i) { matr[i] = new int [columnas]; } } Matriz::Matriz(const Matriz &mat) { this->filas = mat.consultar_filas(); this->columnas = mat.consultar_columnas(); matr = new int* [filas]; for (int i = 0; i < filas; ++i) { matr[i] = new int [columnas]; } for (int i = 0; i < filas; ++i) { for (int j = 0; j < columnas; ++j) { matr[i][j] = mat.consultar(i, j); } } } Matriz::~Matriz() { delete[] matr; } const int Matriz::consultar_filas() { return this->filas; } const int Matriz::consultar_columnas() { return this->columnas; } const int Matriz::consultar(int fila, int columna) { return this->matr[fila][columna]; } void Matriz::modificar(int fila, int columna, int x) { matr[fila][columna] = x; } void Matriz::sumar(const Matriz &mat) { for (int i = 0; i < filas; ++i) for (int j = 0; j < columnas; ++j) matr[i][j] += mat.consultar(i, j); } void Matriz::multiplicar(const Matriz &mat, int pos) { for (int i = 0; i < filas; ++i) { for (int j = 0; j < columnas; ++j) { int res = 0; for (int k = 0; k < pos; ++k) res += matr[i][k] * mat.consultar(k, j); matr[i][j] = res; } } } void Matriz::leer() { for (int i = 0; i < filas; ++i) for (int j = 0; j < columnas; ++j) cin >> matr[i][j]; } void Matriz::escribir() { for (int i = 0; i < filas; ++i) { for (int j = 0; j < columnas; ++j) cout << matr[i][j] << " "; cout << endl; } }
Si elimino la etiqueta const de las tres funciones que devuelven un error al compilar, el error desaparece, pero me gustaría saber el porque de este error, ya que los métodos que utilizo con el objeto constante no son modificadores, e incluso he probado a hacer los métodos constantes por si acaso, pero ni con esas.
Gracias!
Al final he conseguido averiguar cual era el problema. Si colocas la etiqueta const delante de una función, estás indicando que el resultado de ésta sera de un tipo constante. En cambio, si lo colocas detrás, estás diciendo que la función no modificará ningún parámetro. Por lo tanto, la solución al error es cambiar las etiquetas de sitio y ponerlas detrás de la función. De esta manera le aseguras al compilador que esa función no modificará ningún parámetro.
Saludos