Hola, como dice el título, ahora lo que me trae por el camino de la amargura es una lista enlazada.
Tengo varios problemas:
El primero (que no tiene nada que ver con la lista, pero me tiene hasta donde yo me sé) es que yo declaro constantes y luego declaro arrays y entre los corchetes pongo el nombre de esa constante (ahora, cuando ponga la definicion de la clase verán a qué me refiero).
class Typeisbn{
public:
Typeisbn(const char* isbn);
~Typeisbn();
bool operator == (const Typeisbn isbn);
friend istream &operator >>(istream is, Typeisbn isbn);
friend ostream &operator <<(ostream os,const Typeisbn &isbn);
friend class Libro;
private:
const int TAM_ISBN = 11;
char ISBN [TAM_ISBN];
};
class Libro{
public:
Libro *next;
Libro();
~Libro();
bool Es_Vacia(Libro l);
Libro Insertarlibro (Libro l);
Libro Eliminarlibro(Libro l);
friend istream &operator >>(istream is, Libro &r);
friend ostream &operator <<(ostream os,const Libro &r);
friend void Listar (Libro l);
Libro Buscar (Libro l);
private:
const int TAM_AUTOR = 40;
const int TAM_LIBRERIA = 20;
const int TAM_TITULO = 105;
char Titulo [TAM_TITULO];
char Libreria [TAM_LIBRERIA];
char Autor [TAM_AUTOR];
Typeisbn isbn;
unsigned fechaedicion;
};
Pues el compilador, para todas estas constantes me dice lo mismo (así que solo voy a poner uno de los mensajes):
Libro.h:16: error: ISO C++ prohíbe la inicialización del miembro ‘TAM_ISBN’
Libro.h:16: error: haciendo a ‘TAM_ISBN’ static
Otro problema que tengo, es que el constructor es vacío (de esos que pones las llaves y ya está), pues el compilador va y suelta:
Libro.C: In constructor ‘Libro::Libro()’:
Libro.C:4: error: no se encuentra una función coincidente para la llamada a ‘Typeisbn::Typeisbn()’
Y el último problema que tengo, es que , por lo que se ve, no estoy manejando los punteros del todo bien:
Libro Libro::Insertarlibro (Libro l){
cin >> *this;
if (!Es_Vacia (l)){
if (atoi(&isbn) <atoi(&l.isbn)){
*next = l;
l = *this;
}
else{
Libro* ult;
new ult;
*ult = l;
do
ult = ult*next;
while (ult *next != NULL);
if (atoi(&isbn) > atoi(&ult.isbn)){
ult*next = *this;
*next = NULL;
}
else{
Libro ant,sig;
new ant;
ant = l;
new sig;
sig = l;
sig = sig*next;
do{
*next = sig;
ant*next = *this;
}while (atoi(&isbn) > atoi(&sig.isbn));
};
};
};
if (Es_Vacia (l))
l = *this;
return l;
}
Aquí el compilador se vuelve loco y me llama de todo menos bonita... (bueno, si hablara, lo haría
):
Libro.C: In member function ‘Libro Libro::Insertarlibro(Libro)’:
Libro.C:18: nota: se requirió primero el método sintetizado ‘std::basic_istream<char, std::char_traits<char> >::basic_istream(const std::basic_istream<char, std::char_traits<char> >&)’ aquí
Libro.C:18: error: argumento de inicialización 1 de ‘std::istream& operator>>(std::istream, Libro&)’
Libro.C:20: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:20: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:26: error: expected type-specifier before ‘ult’
Libro.C:26: error: expected `;' before ‘ult’
Libro.C:29: error: operadores inválidos de tipos ‘Libro*’ y ‘Libro*’ para el binario ‘operator*’
Libro.C:30: error: operadores inválidos de tipos ‘Libro*’ y ‘Libro*’ para el binario ‘operator*’
Libro.C:31: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:31: error: solicitud por el miembro ‘isbn’ en ‘ult’, el cual es del tipo ‘Libro*’ que no es clase
Libro.C:32: error: operadores inválidos de tipos ‘Libro*’ y ‘Libro*’ para el binario ‘operator*’
Libro.C:33: error: no match para ‘operator=’ en ‘*((Libro*)this)->Libro::next = 0’
Libro.h:20: nota: los candidatos son: Libro& Libro::operator=(const Libro&)
Libro.C:37: error: expected type-specifier before ‘ant’
Libro.C:37: error: expected `;' before ‘ant’
Libro.C:39: error: expected type-specifier before ‘sig’
Libro.C:39: error: expected `;' before ‘sig’
Libro.C:41: error: no match para ‘operator*’ en ‘sig * ((Libro*)this)->Libro::next’
Libro.C:44: error: no match para ‘operator*’ en ‘ant * ((Libro*)this)->Libro::next’
Libro.C:45: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Libro.C:45: error: no se puede convertir ‘Typeisbn*’ a ‘const char*’ para el argumento ‘1’ para ‘int atoi(const char*)’
Los atoi, ya veré como los resuelvo, no es que me preocupen demasiado. Lo que me preocupa es el manejo en sí de los punteros. Mi problema es que, el año pasado aprendí pascal, y parece que tengo una empanada mental del tamaño de un estadio olímpico...
Como siempre, agradezco toda ayuda, consejo o tirón de orejas.