Título: El último post el que esta abajo. -> Publicado por: anonimo12121 en 12 Marzo 2011, 00:51 am al introducir nombre se me cierra el programa y no lo entiendo.
Código: #include <iostream> Título: Re: No entiendo por que se me cierra el programa Publicado por: Akai en 12 Marzo 2011, 01:22 am Seguramente te esté dando una violación de segmento por lo siguiente:
Código
constructor: Código
No les das tamaño. Título: Re: No entiendo por que se me cierra el programa Publicado por: anonimo12121 en 12 Marzo 2011, 01:29 am Seguramente te esté dando una violación de segmento por lo siguiente: Por favor akai dime que se supone que debo de poner.Código
constructor: Código
No les das tamaño. Título: Re: No entiendo por que se me cierra el programa Publicado por: Akai en 12 Marzo 2011, 02:10 am o bien declaras nombre y tlf como
Código
o algo así, y en el constructor no haces nada, o bien, dejas la declaración como puntero y en el constructor haces lo siguiente: Código
En principio, si luego vas a leer una cadena, no necesitas asignarles el \0. Por otro lado, en C++, a menos que trabajes con la clase string, que no es lo mismo que trabajar con char[] o char* no puedes hacer que nombre="\0" o tlf="\0". Sino que has de asignar caracter a caracter o copiar con funciones. Además, la cadena vacía es "" no "\0". Título: Re: Alaa punteraco con clase Publicado por: anonimo12121 en 12 Marzo 2011, 11:25 am ok gracias.
EDITO: Para no crear un post tonto... Díganme si el uso que le he dado a un puntero que apunta a una clase en la función bubble está bien hecho o no se debería de hacer así por favor. Código
Saludos Título: Re: El último post el que esta abajo. -> Publicado por: satu en 12 Marzo 2011, 18:20 pm Hola
Para lo que quieres hacer debes sobrecargar el operador = Código
Código
De esta forma en la función bubble te quedaría Código
Saludos Título: Re: El último post el que esta abajo. -> Publicado por: anonimo12121 en 12 Marzo 2011, 23:12 pm Hola y a que se debe que me de buen resultado?Para lo que quieres hacer debes sobrecargar el operador = Código
Código
De esta forma en la función bubble te quedaría Código
Saludos Título: Re: El último post el que esta abajo. -> Publicado por: satu en 13 Marzo 2011, 18:16 pm Hola
Pues se debe a que le estás diciendo al compilador cómo asignar los objetos de esa clase. Date cuenta que cuando asignas enteros el compilador sabe qué tiene que hacer, pero cuando se encuentra con objetos de la clase "base" o de cualquier clase tienes que decírselo tú. Saludos Título: Re: El último post el que esta abajo. -> Publicado por: anonimo12121 en 13 Marzo 2011, 18:26 pm Ose lo que debo de hacer es darle a cada miembro su valor uno a uno.
Esque pensaba que lo que hacia al hacerlo con la clase directa lo hacia todo. Título: Re: El último post el que esta abajo. -> Publicado por: satu en 13 Marzo 2011, 21:21 pm Eso es lo primero que se piensa por la costumbre de la asignación de enteros y otros tipos simples pero con objetos "no funciona" porque no sabes qué va a hacer el compilador.
El problema de la forma en que tú lo has hecho es que no has reservado memoria para p entonces te peta, aparte de que el operador = no lo has definido. Lee sobre la sobrecarga de operadores porque es muy útil, entre otras cosas para ordenar los elementos o compararlos con <, >, ==, != o imprimir con cout, etc Saludos Título: Re: El último post el que esta abajo. -> Publicado por: Akai en 13 Marzo 2011, 21:30 pm En principio, la importancia de sobrecargar el operador de asignación o de realizar un constructor de copia en una clase viene por lo siguiente:
(Dependiendo del compilador, pero en principio) Si no están definidos, se copia campo a campo. Problema? Si tienes memoria dinámica, y copias campo a campo, tienes dos punteros apuntando al mismo sitio. La copia es borrada (por ejemplo, pasabas por copia en una función) y con ello se libera la memoria dinámica a la cual apuntaba. Ahora, el original tiene un campo que apunta a un espacio liberado, mala suerte, violación de segmento cuando accedas y fin del programa. Solución? constructores de copia y sobrecarga de operadores de asignación, para en caso que tu clase trabaje con memoria dinámica, replicar dicha memoria de forma manual, y no copiando el puntero. (por ejemplo, volviendo a declarar un vector y copiando todos los elementos manualmente, en vez que el compilador simplemente te copie el puntero). |