SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Checho360 en Lunes 28 de Marzo de 2011, 21:39

Título: Error en contructor de copia
Publicado por: Checho360 en Lunes 28 de Marzo de 2011, 21:39
Bueno, tengo el siguiente codigo:

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3. #define MAX_SIZE 10
  4.  
  5. class matrix{
  6.       public:
  7.              int size; double s[MAX_SIZE];
  8.              matrix (int n);
  9.              ~matrix() {}
  10.              int test_matrix (int a);
  11.              matrix scan_matrix (void);
  12.              matrix operator + (matrix A);
  13.              void print_matrix (void);
  14.              matrix (matrix& A);//<---------------Aqui esta la declaracion
  15. };
  16.  
  17. matrix :: matrix (matrix& A){ //<-------------Aqui esta la implementación
  18.        size = A.size;
  19.        for (int i=0;i<A.size;i++) s[i]=A.s[i];
  20.        }
  21.  
  22. matrix :: matrix (int n){
  23.        size = test_matrix(n);
  24.        }
  25.  
  26. int matrix :: test_matrix (int a){
  27.     if(a>MAX_SIZE){
  28.                    cerr<<"Demasiados elementosn";
  29.                    a=MAX_SIZE;
  30.                    }
  31.     return a;
  32. }
  33.  
  34. matrix matrix :: scan_matrix (void){
  35.        for(int i=0;i<size;i++){
  36.        cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];
  37.        }
  38. }
  39.  
  40. matrix matrix :: operator + (matrix A){
  41.      if(A.size!=size){
  42.                       cerr<<"Los vectores han de ser del mismo orden";
  43.                       }
  44.      matrix C (A.size);
  45.      for(int i=0;i<A.size;i++){
  46.             C.s[i]=s[i]+A.s[i];}
  47.      return C;
  48.      }
  49.  
  50. void matrix :: print_matrix (void){
  51.      for(int i= 0;i<size;i++){
  52.              cout<<"Suma no "<<i<<" = "<<s[i]<<"n";
  53.              }
  54.      }
  55.  
  56. int main(){
  57.     int n;int m;
  58.     cout<<"Introduzca el orden del vector1n";
  59.     cin>>n;
  60.     matrix A(n);
  61.     A.scan_matrix();
  62.     cout<<"Introduzca el orden del vector2n";
  63.     cin>>m;
  64.     matrix B(m);
  65.     B.scan_matrix();
  66.    
  67.     matrix D = A + B;
  68.    
  69.     D.print_matrix ();
  70.    
  71.     system("pause");return 1;
  72. }
  73.  
  74.  

Sé que el error está en alguna parte del constructor de copia por que el programa compila y funciona si le quito esa redefinición, sin embargo no encuentro el error. A ver si alguien me puede decir donde está el error y ya de paso por qué hay que tener escrito el operador '&' en la declaración.

Un saludo y muchas gracias de antemano!!!
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 15:20
Bueno me había confundido de código
Título: Re: Error en contructor de copia
Publicado por: m0skit0 en Martes 29 de Marzo de 2011, 16:59
Fíjate que el constructor de copia no recibe matrix A, sino matrix& A.
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 17:04
Cita de: "m0skit0"
Fíjate que el constructor de copia no recibe matrix A, sino matrix& A.

Pero si no le pongo el & tampoco compila :S
Título: Re: Error en contructor de copia
Publicado por: m0skit0 en Martes 29 de Marzo de 2011, 17:27
Cita de: "Checho360"
Pero si no le pongo el & tampoco compila :S
Yo no he dicho que no le pongas el & querido amigo. Y si no dices qué errores te da, pues difícilmente podremos ayudarte.
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 17:44
Aqui estan los errores:

(http://img6.imageshack.us/img6/3899/sinttulom.gif) (http://img6.imageshack.us/i/sinttulom.gif/)

Uploaded with ImageShack.us (http://imageshack.us)
Título: Re: Error en contructor de copia
Publicado por: Epa en Martes 29 de Marzo de 2011, 17:49
Buenas.

El error no esta en el contructor copia (que de hecho ni lo usas) sino en el operador +

Este deberia ser:

matrix& matrix::operator+ (const matrix& A){

y la instancia de clase C

matrix* C= new matrix(A.size);

Ya que sino estaria devolviendo un objeto local a ese metodo.

Para usar el contructor copia tendiras que hacer

matrix C(A + B);

en lugar de

matrix C = A + B;

Saludos
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 18:08
Hola Epa. Tienes razón en ese sitio ni siquiera utilizo el constructor copia, pero de todas formas, cuando quito las lineas 14 a 21 (declaración de constructor copia e implementación) el programa funciona perfectamente; por qué es eso??

Un saludo!!
Título: Re: Error en contructor de copia
Publicado por: Epa en Martes 29 de Marzo de 2011, 18:19
La verdad me mataste jaja  :hitcomp:
No se tanto de C++ como de C.

Per curisamente si cambias el contructor copia por

matrix::matrix(const matrix& A)

Compila correctamente.

Quizas alguien que sepa mas de obejtos pueda dar una explicacion de esto  :rolleyes:

Saludos
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 18:29
OK jajaja a ver entonces si alguien dice; de momento cambio lo que tu dices de const en el copia jaja

Un saludo y muchas gracias por contestar ;)
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 18:36
Bueno pues tienes razón Epa; modificando eso para ponerle un const compila y funciona perfectamente:

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3. #define MAX_SIZE 10
  4.  
  5. class matrix{
  6.       public:
  7.              int size; double s[MAX_SIZE];
  8.              matrix (int n);
  9.              ~matrix() {}
  10.              int test_matrix (int a);
  11.              matrix scan_matrix (void);
  12.              matrix operator + (matrix A);
  13.              void print_matrix (void);
  14.              matrix (const matrix& A);//<---------------Aqui esta la declaracion
  15. };
  16.  
  17. matrix::matrix(const matrix& A){ //<-------------Aqui esta la implementación
  18.        size = A.size;
  19.        for (int i=0;i<A.size;i++) s[i]=A.s[i];
  20.        }
  21.  
  22. matrix :: matrix (int n){
  23.        size = test_matrix(n);
  24.        }
  25.  
  26. int matrix :: test_matrix (int a){
  27.     if(a>MAX_SIZE){
  28.                    cerr<<"Demasiados elementosn";
  29.                    a=MAX_SIZE;
  30.                    }
  31.     return a;
  32. }
  33.  
  34. matrix matrix :: scan_matrix (void){
  35.        for(int i=0;i<size;i++){
  36.        cout<<"Ingresa el coef "<<i<<"n";cin>>s[i];
  37.        }
  38. }
  39.  
  40. matrix matrix :: operator + (matrix A){
  41.      if(A.size!=size){
  42.                       cerr<<"Los vectores han de ser del mismo orden";
  43.                       }
  44.      matrix C (A.size);
  45.      for(int i=0;i<A.size;i++){
  46.             C.s[i]=s[i]+A.s[i];}
  47.      return C;
  48.      }
  49.  
  50. void matrix :: print_matrix (void){
  51.      for(int i= 0;i<size;i++){
  52.              cout<<"Suma no "<<i<<" = "<<s[i]<<"n";
  53.              }
  54.      }
  55.  
  56. int main(){
  57.     int n;int m;
  58.     cout<<"Introduzca el orden del vector1n";
  59.     cin>>n;
  60.     matrix A(n);
  61.     A.scan_matrix();
  62.     cout<<"Introduzca el orden del vector2n";
  63.     cin>>m;
  64.     matrix B(m);
  65.     B.scan_matrix();
  66.    
  67.     matrix D = A + B;
  68.     matrix E(A+B);
  69.    
  70.     D.print_matrix ();
  71.     E.print_matrix ();
  72.    
  73.     system("pause");return 1;
  74. }
  75.  
  76.  
  77.  

A ver si alguien puede decir por que pasa esto :S

Un saludo!!
Título: Re: Error en contructor de copia
Publicado por: m0skit0 en Martes 29 de Marzo de 2011, 19:01
El error que te da es porque no tienes constructor por defecto. Es decir, declaras

Código: C++
  1. matrix D
  2.  
pero esto no lo puedes hacer porque tu constructor pide un argumento.

Saludos.
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 19:08
Cita de: "m0skit0"
El error que te da es porque no tienes constructor por defecto. Es decir, declaras

Código: C++
  1. matrix D
  2.  
pero esto no lo puedes hacer porque tu constructor pide un argumento.

Saludos.

Si pero de todas formas si fuera por eso no debería de funcionar al poner esto ? :

Código: C++
  1.     matrix D(n);
  2.     D = A + B;
  3.  

Es que así tampoco funciona
Título: Re: Error en contructor de copia
Publicado por: m0skit0 en Martes 29 de Marzo de 2011, 19:54
Es que el constructor copia es matrix::matrix(const matrix& A) y no matrix::matrix(matrix& A) (léete esto (http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html) de principio a fin).
Título: Re: Error en contructor de copia
Publicado por: Checho360 en Martes 29 de Marzo de 2011, 20:15
Cita de: "m0skit0"
Es que el constructor copia es matrix::matrix(const matrix& A) y no matrix::matrix(matrix& A) (léete esto (http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html) de principio a fin).


Bueno pues así es  entonces; esa es la forma de crear el constructor copia y lo tenía mal declarado...

Un saludo y muchas gracias a todos!