Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error en contructor de copia

Estas en el tema de Error en contructor de copia en el foro de C/C++ en Foros del Web. Bueno, tengo el siguiente codigo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include <iostream> using namespace std ; #define MAX_SIZE 10   class matrix {   ...
  #1 (permalink)  
Antiguo 28/03/2011, 14:08
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 1 mes
Puntos: 3
Error en contructor de copia

Bueno, tengo el siguiente codigo:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3. #define MAX_SIZE 10
  4.  
  5. class matrix {
  6.      
  7.       public:
  8.              
  9.       int size; double s[MAX_SIZE];
  10.      
  11.       matrix (int n){
  12.              
  13.              if (n > MAX_SIZE) {
  14.                    cerr<<"error, demasiado grande"; return;
  15.                    }
  16.              size = n;
  17.              }
  18.       matrix operator = (matrix A);
  19.      
  20.       ~matrix () {}
  21.      
  22.       matrix scan_matrix ();
  23.      
  24.       matrix suma_matrix (matrix A);
  25.      
  26.       };
  27.      
  28.       matrix matrix :: scan_matrix (){
  29.              for(int i=0;i<size;i++){
  30.                      cout<<"Introduzca el valor "<<i<<" de la matriz\n";cin>>s[i];}
  31.                      }
  32.       matrix matrix :: suma_matrix(matrix A){
  33.              if(size!=A.size){cerr<<"Las matrices no pueden sumarse";}
  34.              matrix C(A.size);
  35.              for (int i=0;i<size;i++){
  36.                  C.s[i]=A.s[i]+s[i];
  37.                  cout<<A.s[i]<<"+"<<s[i]<<"="<<C.s[i]<<"\n";
  38.                  }return C;}
  39.                  
  40.       matrix matrix :: operator = (matrix A){
  41.              matrix temp (A.size);
  42.              for (int i=0;i<A.size;i++){
  43.                  temp.s[i]=A.s[i];
  44.                  }
  45.                  return temp;
  46.                  }
  47.      
  48.       int main (int n, int m){
  49.           cout<<"Introduzca el orden del vector 1\n";cin>>n;
  50.           matrix A(n);
  51.           A.scan_matrix();
  52.           cout<<"Introduzca el orden del vector 2\n";cin>>m;
  53.           matrix B(m);
  54.           B.scan_matrix();
  55.           matrix C=A.suma_matrix(B);
  56.           for(int i=0;i<n;i++){cout<<C.s[i]<<" ";}
  57.           system ("pause");
  58. }

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!!!
  #2 (permalink)  
Antiguo 29/03/2011, 01:36
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: Error en contructor de copia

El error puede estar en la declaración de temp, ya que deberías crear el objeto con un new, para lo que tienes que definir el constructor de copia (ahora, aunque digas que lo tienes, lo que tienes es el operador de asignacion)

matrix temp = new matrix(A.size);

Por otra parte, no deberías declarar los atributos como públicos (eso no dará errores de compilación ni ejecución, pero no está bien hacerlo)
  #3 (permalink)  
Antiguo 29/03/2011, 07:16
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Error en contructor de copia

Cita:
Iniciado por Heimish2000 Ver Mensaje
El error puede estar en la declaración de temp, ya que deberías crear el objeto con un new, para lo que tienes que definir el constructor de copia (ahora, aunque digas que lo tienes, lo que tienes es el operador de asignacion)

matrix temp = new matrix(A.size);

Por otra parte, no deberías declarar los atributos como públicos (eso no dará errores de compilación ni ejecución, pero no está bien hacerlo)
Ostia tienes toda la razón; no es que no tenga definido el constructor copia es que me había confundido de código jajajja

Aqui esta el codigo de verdad:

Código C++:
Ver original
  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 elementos\n";
  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 vector1\n";
  59.     cin>>n;
  60.     matrix A(n);
  61.     A.scan_matrix();
  62.     cout<<"Introduzca el orden del vector2\n";
  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. }

Un saludo!!!

Última edición por Checho360; 29/03/2011 a las 09:05
  #4 (permalink)  
Antiguo 29/03/2011, 09:26
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: Error en contructor de copia

¿Que error te da? ¿Has probado a poner me.size y me.s[i]? (Creo que es me, ahora programo en Java y en Java es this, pero en C creo recordar que es me)

Sigo diciendo que los atributos los deberías poner en la parte privada de la clase, pero ese es otro tema.
  #5 (permalink)  
Antiguo 29/03/2011, 09:49
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Error en contructor de copia

Aqui estan los errores:

http://img6.imageshack.us/i/sinttulom.gif/


Última edición por Checho360; 29/03/2011 a las 10:10
  #6 (permalink)  
Antiguo 29/03/2011, 10:42
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: Error en contructor de copia

Te lo pone bien claro...

Tu, en tu constructor por copia, estás pasando la referencia a un objeto de tipo matrix (por eso el &), pero en esa linea no estás pasando la referencia, estás pasando el objeto. Lo puedes ver porque si te fijas, el operador + devuelve un matrix, no un matrix& y por eso te da error.

Soluciones: Que acepte un objeto y no su referencia o pasarle al constructor una referencia y no un objeto.
  #7 (permalink)  
Antiguo 29/03/2011, 10:56
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Error en contructor de copia

Cita:
Iniciado por Heimish2000 Ver Mensaje
Te lo pone bien claro...

Tu, en tu constructor por copia, estás pasando la referencia a un objeto de tipo matrix (por eso el &), pero en esa linea no estás pasando la referencia, estás pasando el objeto. Lo puedes ver porque si te fijas, el operador + devuelve un matrix, no un matrix& y por eso te da error.

Soluciones: Que acepte un objeto y no su referencia o pasarle al constructor una referencia y no un objeto.
Lo consegui añadiendo un const al constructor copia y funciona:

Código C++:
Ver original
  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 + (const 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 elementos\n";
  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 + (const 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 vector1\n";
  59.     cin>>n;
  60.     matrix A(n);
  61.     A.scan_matrix();
  62.     cout<<"Introduzca el orden del vector2\n";
  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. }

Me podrias escribir el codigo con tus soluciones??

Un saludo!!
  #8 (permalink)  
Antiguo 29/03/2011, 15:04
 
Fecha de Ingreso: diciembre-2010
Mensajes: 20
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Error en contructor de copia

¿Por qué hay que tener escrito el operador '&' en la declaración.?

Para evitar un ciclo infinito. Si el constructor copia recibe el parámetro por valor, ¿adivinas a que función se va a llamar para COPIAR el valor de la variable al parámetro? ¡Al constructor copia!

¿y el const?

Si no aumentas const el constructor copia estará restringido a funcionar sólo si recibe un objeto no constante, es decir que puede ser modificado internamente. Como ya te habrás dado cuenta tal limitación implica que no puedas escribir "matrix D = A + B;" o "matrix E(A+B);" por que internamente el compilador necesita que tu constructor copia pueda recibir como parámetro objetos constantes.
  #9 (permalink)  
Antiguo 29/03/2011, 15:15
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Error en contructor de copia

Muchas gracias Aemilius!!

Etiquetas: copia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:31.