Cita:
Iniciado por detective_jd Hola ¿cómo están?, gracias por responder, créanme que si no me mareara tanto los punteros y los valores por referencia no pediría ayuda, además hice lo que me dijeron y me dan más errores, cómo dije anteriormente tanto en java como php no tengo este tipo de problemas pero con esto de los punteros y los parámetros por referencia sí, pongo el código:
Código C++:
Ver original#include <list>
#include "Persona.h"
#ifndef MANPERSONAS_H
#define MANPERSONAS_H
using namespace std;
std::list<Persona*>lista;
static int maxIdP = 0;
int getMaxIdP(){
return ++maxIdP;
}
bool check(Persona& p){
if(p != nullptr){ // acá me da error por el objeto pasado por parámetro
for(Persona* per : lista){
if(per->nom == p.nom){
return true;
}
}
}
return false;
}
Persona* getRow(std::string xnom){
for(Persona* p : lista){
if(p->nom == xnom){
return p;
}
}
return NULL;
}
Persona* getRow(int xid){
for(Persona* p : lista){
if(p->id == xid){
return p;
}
}
return NULL;
}
bool create(Persona& p){ // acá me da error por el objeto pasado por parámetro
if(check(p)){
return false;
}
else{
lista.push_back(p); // acá me da error por el objeto pasado por parámetro
return true;
}
}
bool update(Persona& p){ // acá me da error por el objeto pasado por parámetro
Persona* per = getRow(p.id);
if(per->nom != &p.nom){ // acá me da error por mal uso de lo que me mencionan
if(check(p)){
return false;
}
}
return true;
}
void deleted(Persona& p){
lista.
remove(p
); // acá me da error por el objeto pasado por parámetro }
std::list<Persona*> read(){
return lista;
}
#endif /* MANPERSONAS_H */
Tampoco es la idea que me hagan la tarea, ya que esto es para mi primo que está haciendo ingeniería en electrotecnia, y me pide ayuda........
Lo de las validaciones lo tendré q ver bien cómo arreglármelas..
Espero sus respuestas y saludos.
Las referencias técnicamente nunca son nulas. Por lo tanto ese if ya no es necesario, incluso el compilador da error, el cual deberías leer.
Por otro lado, cuando usas referencias, no usas el operador -> que sólo aplica a punteros, usas el operador .(punto).
El push_back te da error porque creaste una lista de punteros, no de objetos. Quitale el * a la lista. Aquí sería interesante que tu o tu primo investigaran un poco sobre las semánticas de copiado y de movido.
También dentro de los for, no obtengas un puntero, obten una referencia al objeto. C++11 hace algo de magia y automáticamente usa semántica de movimiento, lo cual lo hace algo mas eficiente.
Hay un patrón de diseño llamada Null Object (objeto nulo). Revísenlo para ver el caso donde no se encuentre la persona. De hecho eferion ya te dijo masomenos como funciona.
Te recomiendo que uses const en los parametros que no modificas, que me parece son todos. Igual, eso ayuda al compilador a crear mejor código máquina.
Finalmente, ten en cuenta lo que menciona eferion. Es bueno ayudarte (aunque me ignoren
) y que termines tu aprendiendo. Que mal por tu primo, porque el mundo que viene exige soltura con la programación al igual que en el habla. En un futuro no muy lejano, no saber programar lo básica será lo mismo que ser analfabeta.