Autor
|
Tema: El último post el que esta abajo. -> (Leído 5,579 veces)
|
anonimo12121
|
al introducir nombre se me cierra el programa y no lo entiendo. #include <iostream> using namespace std; class base { private: char *nombre; char *tlf; public: base(); void delname(); void deltlf(); void dnuevo(); void view(); }; base::base(){ nombre="\0"; tlf="\0"; }; void base::delname(){ }; void base::deltlf(){ }; void base::dnuevo(){ cout << "\nIntroduce un nombre: " ; cin >> nombre; cout << "\nIntroduce un telefono: "; cin >> tlf; }; void base::view(){ cout << "---------------------------------------------------------" << endl; cout << "Nombre: " << nombre << endl; cout << "Tlfn: " << tlf << endl; cout << "---------------------------------------------------------" << endl; cout << "1-Nuevo\t2-Eliminar 3-Salir" << endl; };
int main(int argc,char *argv[]){ base b[10]; int pag=0; int evento=0; int pagmax=0; while(1){ b[pag].view(); cout << "Opcion: "; cin >> evento; if(evento==1){ pagmax=pagmax+1; b[pagmax].dnuevo(); } else if(evento==2); else if(evento==3)break; evento=0; } cin.get(); return 0; }
|
|
« Última modificación: 12 Marzo 2011, 16:03 pm por Xafirot »
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Seguramente te esté dando una violación de segmento por lo siguiente: char *nombre; char *tlf
constructor: nombre="\0"; tlf="\0";
No les das tamaño.
|
|
|
En línea
|
|
|
|
anonimo12121
|
Seguramente te esté dando una violación de segmento por lo siguiente: char *nombre; char *tlf
constructor: nombre="\0"; tlf="\0";
No les das tamaño. Por favor akai dime que se supone que debo de poner.
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
o bien declaras nombre y tlf como char nombre[20] char tlf[10]
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: nombre=new char[20] //o tu tamaño tlf=new char[10]//o tu tamaño
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".
|
|
|
En línea
|
|
|
|
anonimo12121
|
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. #include <iostream> using namespace std; class base { private: bool rellena;//0 no tiene contenido . 1 tiene contenido char *nombre; char *tlf; public: base(); void del(); void dnuevo(); void editar(); void view(int n); void freeram(); }; base::base(){ rellena = false; nombre = new char[20]; tlf = new char[20]; }; void base::del(){ }; void base::dnuevo(){ cout << "\nIntroduce un nombre: " ; cin >> nombre; cout << "\nIntroduce un telefono: "; cin >> tlf; rellena=true; }; void base::freeram(){ delete[] nombre; delete[] tlf; }; void base::editar(){ dnuevo(); }; void base::view(int n){ cout << "---------------------------------------------------------" << endl; cout << "Nombre: "; if(rellena==true)cout << nombre; cout << endl; cout << "Tlfn: "; if(rellena==true)cout << tlf ; cout << endl; cout << "---------------------------------------------------------" << endl; cout << "1-Nuevo\t2-Eliminar 3-Salir 4-Editar 8-Pagback 9-Pagnext\t Pag: " << n << endl; }; void bubble(int n1,int n2,base b[]){ base *p; for(int i=n1;i<n2;i++){ p=&b[i+1]; b[i]=*p; } }; int main(int argc,char *argv[]){ base b[10]; int pag=1; int evento=0; int pagmax=0; while(1){ b[pag].view(pag); cout << "Opcion: "; cin >> evento; if(evento==1){ pagmax=pagmax+1; pag=pagmax; b[pag].dnuevo(); } else if(evento==2){ if(pag!=1){ bubble(pag,pagmax,b); pagmax--; } } else if(evento==3)break; else if(evento==4)b[pag].editar(); else if(evento==8 && pag>1)pag--; else if(evento==9 && pag < pagmax)pag++; evento=0; cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" ; } for(int i=0;i<10;i++)b[i].freeram(); cout << "El programa se cerrara" << endl; cin.get(); return 0; }
Saludos
|
|
« Última modificación: 12 Marzo 2011, 15:58 pm por Xafirot »
|
En línea
|
|
|
|
satu
Desconectado
Mensajes: 301
Siempre aprendiendo
|
Hola Para lo que quieres hacer debes sobrecargar el operador = base operator = (const base &b);
base base::operator = (const base &b) { rellena = b.rellena; strcpy(nombre, b.nombre); strcpy(tlf, b.tlf); }
De esta forma en la función bubble te quedaría void bubble(int n1,int n2,base b[]){ for(int i=n1;i<n2;i++) b[i]=b[i+1]; }
Saludos
|
|
|
En línea
|
Breakbeat como forma de vida
|
|
|
anonimo12121
|
Hola Para lo que quieres hacer debes sobrecargar el operador = base operator = (const base &b);
base base::operator = (const base &b) { rellena = b.rellena; strcpy(nombre, b.nombre); strcpy(tlf, b.tlf); }
De esta forma en la función bubble te quedaría void bubble(int n1,int n2,base b[]){ for(int i=n1;i<n2;i++) b[i]=b[i+1]; }
Saludos y a que se debe que me de buen resultado?
|
|
|
En línea
|
|
|
|
satu
Desconectado
Mensajes: 301
Siempre aprendiendo
|
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
|
|
|
En línea
|
Breakbeat como forma de vida
|
|
|
anonimo12121
|
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.
|
|
|
En línea
|
|
|
|
satu
Desconectado
Mensajes: 301
Siempre aprendiendo
|
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
|
|
|
En línea
|
Breakbeat como forma de vida
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
HOLA donde esta mi ultimo post???
Sugerencias y dudas sobre el Foro
|
ジ
|
6
|
3,359
|
19 Enero 2005, 00:43 am
por Karcsi
|
|
|
Espero k sea mi ultimo post utilizando win.
GNU/Linux
|
black_angel
|
7
|
3,409
|
13 Marzo 2011, 08:16 am
por mauriciodelos
|
|
|
tengo un cable de red para el xbox 360 pero mi modem esta abajo y no me alcanza
Juegos y Consolas
|
pepotas
|
0
|
1,424
|
2 Febrero 2008, 16:49 pm
por pepotas
|
|
|
¿que le sucedía al último post que posteé que ha sido eliminado?
Sugerencias y dudas sobre el Foro
|
Jade19
|
1
|
3,437
|
6 Marzo 2011, 05:04 am
por Nardo[N]
|
|
|
El precio del litio se desploma un 50% en el último año: ¿está afectando a ...
Noticias
|
wolfbcn
|
0
|
1,102
|
13 Noviembre 2019, 14:20 pm
por wolfbcn
|
|