Buenas. Tengo un pequeño problema con una clase Matriz que estoy desarrollando en C++. Según tengo entendido, cuando un parámetro de una función va a ser constante durante toda la ejecución de esa función, se pasa ese parámetro en forma constante y por referencia. Bien, el problema es que en mi clase matriz, me salta un error de compilación en la copiadora-constructora por el uso del tag const en las tres consultoras de la clase (si lo haces desde fuera la clase, los métodos que hacen saltar el error si que funcionan). El error es el siguiente (compilado con g++):
Y el código de la clase en la que salta el error es este:
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
Código [Seleccionar]
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 (cpp) [Seleccionar]
#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