[C con Clase] Ayuda con este problema.

Davidson, Steven srd4121 en njit.edu
Jue Ago 25 19:55:55 CEST 2016


Hola Jorge Luis,

Sin conocer los mensajes de error ni el programa que los lanzó (compilador,
enlazador, el sistema operativo), no podemos ser de mucha ayuda. De todas
maneras, te doy unos matices acerca del código fuente por si te sirven para
determinar el problema o quizá resolverlo:

- El fichero de cabecera, <conio.h>, no pertenece al estándar de C/C++, por
lo que tu compilador puede o no tenerlo. De todas formas, no usas ninguna
función de <conio.h>, por lo que puedes eliminar su inclusión.
- Deberías #incluir los ficheros <cstdlib> y <ctime>, ya que usas las
funciones estándares, 'srand()' y 'time()', respectivamente.
- Usas una plantilla de clase, 'Matrix', que tampoco es estándar. Por lo
tanto, debes incluir su definición en este código fuente.

Sospecho que estás usando la biblioteca presentada en este enlace:
https://ronnyml.wordpress.com/2009/07/04/operaciones-con-matrices-clase-matriz-en-c/
 Si es así, entonces ten cuidado a la hora de incluir los ficheros de
cabecera. Si te fijas en su ejemplo de "main.cpp", lo que hace es incluir
"matrix.cpp". Esto es porque se trata de una plantilla; y las plantillas no
se pueden compilar aparte.

Sinceramente, aconsejo que combines ambos ficheros, "matrix.h" y
"matrix.cpp", en un solo fichero de cabecera: "matrix.h". Así no tendrás
muchos problemas a la hora de usar la plantilla. Tal fichero debería
serguie este esquema:

#ifndef MATRIX_H
#define MATRIX_H

#include <iostream>
#include <time>
#include <cstdlib>

using namespace std;

template <class T>
class Matrix {
    public:
...
};

// Constructor por defecto
template<typename T>
Matrix<T>::Matrix()
{
    m_rows = 4;
    m_cols = 4;
}
...
template<typename T>
Matrix<T>::~Matrix() {}

#endif // MATRIX_H


Es decir, que todo el contenido de ambos ficheros queden comprendidos entre
#ifndef y #endif. Ahora puedes incluir el fichero, "matrix.h", sin
problemas.

Por último, aconsejo cambiar el destructor de 'Matrix', para que invoque
'delete_matrix()'; es decir,

template<typename T>
Matrix<T>::~Matrix()
{
  delete_matrix();
}

Es un grave error que este destructor no libere la memoria automáticamente,
pero dejar que el código externo se responsabilice de invocar
'delete_matrix()' manualmente.


Espero que esto te ayude.

Steven



2016-08-25 8:57 GMT-04:00 jorge luis rios herrera <
jorge.rios.herrera en outlook.es>:

>
> Hola buen día, si podrán ser tan amables de auxiliarme con un problema de
> c++ que no puedo compilar ya le cambie las librerías ya hice de todo un
> poco pero me marca error les anexo el código.
> de antemano mil gracias.
>
>
>
>
>
>
>
> #include <iostream>
> #include <iostream>
> #include <conio.h>
>
> using namespace std;
>
> int main()
> {
>     // Para no generar los mismos números aleatorios
>     srand(time(NULL));
>
>     int n_rows;
>     int n_cols;
>     int col_1;
>     int col_2;
>     int row_1;
>     int row_2;
>     int scalar;
>
>     cout << "Ingresa nro de filas: " << endl;
>     cin >> n_rows;
>     cout << "Ingresa nro de columnas: " << endl;
>     cin >> n_cols;
>     cout << endl;
>
>     Matrix<int> a(n_rows, n_cols);
>     Matrix<int> b(n_rows, n_cols);
>
>     // Matriz para almacenar el resultado de las operaciones
>     Matrix<int> c(n_rows, n_cols);
>
>     a.fill_random();
>     b.fill_random();
>
>     cout << "********** Operaciones básicas con la Matriz A **********" <<
> endl;
>     cout << "Matriz A " << endl;
>     a.print_matrix();
>
>     cout << "El mayor de la Matriz es: " << a.get_max() << endl;
>     cout << "El menor de la Matriz es: " << a.get_min() << endl;
>     cout << "La moda de la Matrix es: " << a.get_mode() << endl;
>     cout << (a.isSymmetric() ? "" : "No") << " Es simétrica." << endl;
>     cout << (a.isIdentity() ? "" : "No") << " Es identidad." << endl;
>     cout << endl;
>
>     cout << "Ingresa el escalar: " << endl;
>     cin >> scalar;
>     a.multiply_by_scalar(scalar);
>     a.print_matrix();
>
>     cout << "Intercambio: Ingresa 2 columnas del 1 al " << n_cols << endl;
>     cout << "Columna 1: " << endl;
>     cin >> col_1;
>     cout << "Columna 2: " << endl;
>     cin >> col_2;
>     a.swap_cols(col_1, col_2);
>     a.print_matrix();
>
>     cout << "Intercambio: Ingresa 2 filas del 1 al " << n_rows << endl;
>     cout << "Fila 1: " << endl;
>     cin >> row_1;
>     cout << "Fila 2: " << endl;
>     cin >> row_2;
>     a.swap_rows(row_1, row_2);
>     a.print_matrix();
>
>     cout << "Transpuesta de A " << endl;
>     a.get_transpose();
>
>     cout << "********** Operaciones con matrices **********" << endl;
>     cout << "Matriz A " << endl;
>     a.print_matrix();
>
>     cout << "Matriz B " << endl;
>     b.print_matrix();
>
>     cout << "Matriz A + B " << endl;
>     c = a + b;
>     c.print_matrix();
>
>     cout << "Matriz A - B " << endl;
>     c = a - b;
>     c.print_matrix();
>
>     cout << "Matriz A * B " << endl;
>     c = a * b;
>     c.print_matrix();
>
>     a.delete_matrix();
>     b.delete_matrix();
>     c.delete_matrix();
>
>     return 0;
> }
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20160825/4f8ae74b/attachment.html>


Más información sobre la lista de distribución Cconclase