• Domingo 15 de Diciembre de 2024, 07:34

Autor Tema:  Error en contructor de copia  (Leído 3982 veces)

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Error en contructor de copia
« en: Lunes 28 de Marzo de 2011, 21:39 »
0
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!!!
« última modificación: Martes 29 de Marzo de 2011, 17:01 por Checho360 »

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #1 en: Martes 29 de Marzo de 2011, 15:20 »
0
Bueno me había confundido de código
« última modificación: Martes 29 de Marzo de 2011, 17:04 por Checho360 »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en contructor de copia
« Respuesta #2 en: Martes 29 de Marzo de 2011, 16:59 »
0
Fíjate que el constructor de copia no recibe matrix A, sino matrix& A.

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #3 en: Martes 29 de Marzo de 2011, 17:04 »
0
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

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en contructor de copia
« Respuesta #4 en: Martes 29 de Marzo de 2011, 17:27 »
0
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.

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #5 en: Martes 29 de Marzo de 2011, 17:44 »
0
Aqui estan los errores:



Uploaded with ImageShack.us

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #6 en: Martes 29 de Marzo de 2011, 17:49 »
0
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
The sweet smell of a great sorrow lies over the land.


Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #7 en: Martes 29 de Marzo de 2011, 18:08 »
0
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!!

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #8 en: Martes 29 de Marzo de 2011, 18:19 »
0
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
The sweet smell of a great sorrow lies over the land.


Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #9 en: Martes 29 de Marzo de 2011, 18:29 »
0
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 ;)

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #10 en: Martes 29 de Marzo de 2011, 18:36 »
0
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!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en contructor de copia
« Respuesta #11 en: Martes 29 de Marzo de 2011, 19:01 »
0
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.

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #12 en: Martes 29 de Marzo de 2011, 19:08 »
0
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

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error en contructor de copia
« Respuesta #13 en: Martes 29 de Marzo de 2011, 19:54 »
0
Es que el constructor copia es matrix::matrix(const matrix& A) y no matrix::matrix(matrix& A) (léete esto de principio a fin).

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Error en contructor de copia
« Respuesta #14 en: Martes 29 de Marzo de 2011, 20:15 »
0
Cita de: "m0skit0"
Es que el constructor copia es matrix::matrix(const matrix& A) y no matrix::matrix(matrix& A) (léete esto 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!