Ola pessoal estou tentando corrigir este código que peguei em um livro a fim de aprimorar meus conhecimentos porém esta dando inumeros erros dos quais desconheço as razões, será que alguem poderia me ajudar.
#include <iostream>
#include <string>
#include <list>
using namespace std;
class Pessoa; // declaração em avanço;
class Livro {
public:
Livro() {
pessoa = 0;
}
bool operator== (const Livro& bk)const {
return strcmp(titulo, bk.titulo) == 0;
}
private:
char *titulo;
Pessoa *pessoa;
friend ostream& operator<< (ostream&,const Livro&);
friend ostream& operator<< (ostream&,const Pessoa&);
friend class livroRetirado;
friend void incluiLivro();
friend void retiraLivro();
friend void devolveLivro();
};
class Autor {
public:
Autor() {
}
bool operator== (const Autor& ar) const {
return strcmp(nome, ar.nome) == 0;
}
private:
char *nome;
list<Livro*>livros;
friend ostream& operator<< (ostream&,const Autor&);
friend ostream& operator<< (ostream&,const Pessoa&);
friend class LivroRetirado;
friend void incluiLivro();
friend void retiradLivro();
friend void devolveLivro();
};
class LivroRetirado {
public:
LivroRetirado(Autor *ar = 0, Livro *bk = 0) {
autor = ar; livro = bk;
}
bool operator== (const LivroRetirado& bk) const {
return strcmp(autor->nome,bk.autor->nome) == 0 &&
strcmp(livro->titulo,bk.livro->titulo) == 0;
}
bool operator!= (const LivroRetirado& bk) const {
return !(*this == bk);
}
bool operator< (const LivroRetirado& bk) const {
if (strcmp(autor->nome,bk.autor->nome) == 0)
return strcmp(livro->titulo,bk.livro->titulo) < 0;
return strcmp(autor->nome,bk.autor->nome)< 0;
}
bool operator> (const LivroRetirado& bk) const {
return !(*this == bk) && !(*this < bk);
}
private:
Autor* autor;
Livro* livro;
friend ostream& operator<< (ostream&, const Pessoa&);
friend void retiraLivro();
friend void devolveLivro();
};
class Pessoa {
public:
Pessoa() {
}
bool operator== (const Pessoa& pn) const {
return strcmp(nome, pn.nome) == 0;
}
private:
char *nome;
list<LivroRetirado> livros;
friend ostream& operator<< (ostream&, const Livro&);
friend ostream& operator<< (ostream&, const Pessoa&);
friend void retiraLivro();
friend void devolveLivro().
};
list<Autor*> catalogo['Z' +1];
list<Pessoa*> pessoas['Z' +1];
template<class T>
ostream& operator<< (ostream& out, const list<T>& lst) {
for (list<T>::iterator ref = lst.begin(); ref != lst.end(); ref++)
out << **ref; //<<sobrecarregado
return out;
}
ostream& operator<< (ostream& out, const Livro& bk) {
out << " * " << bk.titulo;
if (bk.pessoa != 0)
out << " - retirado por " << bk.pessoa->nome; // sobrecarregado
out << endl;
return out;
}
ostream& operator<< (ostream& out, const Autor& ar) {
out << ar.nome << endl << ar.livros; // sobrecarregado
return out;
}
ostream& operator<< (ostream& out. const Pessoa& pr) {
out << pr.nome;
if (!pr.livros.empty() ) {
out << " tem os seguintes livros: \n";
list<LivroRetirado>::iterator bk = pr.livros.begin();
for ( ; bk != pr.livros.end(); bk++)
out << " * " << bk->autor->nome << ", "
<< bk->livro->titulo << endl;
}
else out << " não tem livros\n";
return out;
}
template<class T1, class T2>
list<T2>::iterator findIt(const list<T2>& lst, const T1& el) {
for (list<T2>::iterator ref = lst.begin(); ref != lst.end(); ref++)
if (**ref == el) // sobrecarregado ==
break;
return ref;
}
char* getString(char *msg) {
char s[82], i, *destin;
cout << msg;
cin.get(s,80);
while (cin.get(s[81]) && s[81] != '\n');
destin = new char[strlen(s) +1;
for (i = 0; destin[i] = toupper(s[i]); i++);
return destin;
}
void status() {
register int i;
cout << "A biblioteca tem os seguintes livros: \n\n";
for (i = 'A'; i <= 'Z'; i++)
if (!catalog[i].empty())
cout << catalog[i];
cout << "\nas seguintes pessoas estao usando a biblioteca:\n\n";
for (i ='A'; i <= 'Z'; i++)
if (!people[i].empty())
cout << people[i];
}
void incluiLivro() {
Autor *newAutor = new Autor;
Livro *newLivro = new Livro;
newAutor->nome = getString("Entre com o nome do autor: ");
newLivro->titulo = getString ("Entre com o titulo do livro:");
list<Autor*>::iterator oldAutor =
findIt (catalog[newAutor->nome[0]], *newAutor);
if (oldAutor == catalog [newAutor->nome[0]].end()){
newAutor->livros.push_front(newLivro);
catalog[newAutor->nome[0]].push_front(newAutor);
}
else (*oldAutor)->livros.push_front(newLivro);
void retiraLivro() {
Pessoa *pessoa = new Pessoa;
Autor autor;
Livro livro;
list<Autor*>::iterator autorRef;
list<Livro*>::iterator livroRef;
pessoa->nome = getString("Entre com o nome da pessoa: ");
while (true) {
autor.nome = getString("Entre com o nome do autor: ");
autorRef = findIt(catalog[autor.nome[0]], autor);
if (autorRef == catalog[autor.nome[0]].end())
cout << "Nome do autor esta errado \n";
else break;
}
while (true){
livro.titulo = getString("Entre com o titulo do livro: ");
livroRef = findIt((*autorRef)->livros,livro);
if (livroRef == (*autorRef) ->livros.end())
cout << "Titulo errado\n";
else break;
}
list<Pessoa*>::iterator pessoaRef;
pessoaRef = findIt(people[pessoa->nome[0]],*pessoa);
LivroRetirado LivroREtirado(*autorRef, *livroRef);
if (pessoaRef == people[pessoa->nome[0]].end()) { //uma nova pessoa
pessoa->livros.push_front(LivroRetirado); //na biblioteca;
people(pessoa->nome[0]].push_front(pessoa);
(*livroRef)->pessoa = *pessoas[pessoa->nome[0]].begin();
}
else {
(*pessoaRef)->livros.push_front(LivroRetirado);
(*livroRef)->pessoa = *pessoaRef;
}
}
void devolveLivro() {
Pessoa pessoa;
Livro livro;
Autor autor;
list<Pessoa*>::iterator pessoaRef;
list<Livro*>::iterator livroRef;
list<Autor*>::iterator autorRef;
while (true) {
pessoa.nome = getString("Entre com o nome da pessoa: ");
pessoaRef = findIt(people[pessoa.nome[0]],pessoa);
if (pessoaRef == people[pessoa.nome[0]].end())
cout <<"nome da pessoa errado\n";
else break;
}
while (true) {
autor.nome = getString("Entre com o nome do autor: ");
autorRef = findIt(catalog[autor.nome[0]], autor);
if (autorRef == catalog[autor.nome[0]].end())
cout <<"nome do autor errado\n";
else break;
}
While (true) {
livro.titulo = getString("Entre com o titulo do livro:");
livroRef = findIt((*autorREf)->livros,livro);
if (livroRef ==(*autorRef)->livros.end())
cout << "Titulo errado\n";
else break;
}
LivroRetirado LivroRetirado(*autorRef, *livroRef);
(*livroRef)->pessoa = 0;
(*pessoaRef)->livros.remove(LivroRetirado);
}
int menu() {
int option;
cout << "\nEntre com uma das seguintes opcoes:"<< endl;
cout << "1. Incluir um livro no catalogo\n2. Retirar um livro"<< endl;
cout << "3. Retornar um livro\n4. Status\n5.Sair"<< endl;
cout << "Sua opcao?";
cin >> option;
cin.get(); //descarta '\n';
return option;
}
int main(void) {
While (true)
switch (menu()) {
case 1: incluiLivro(); break;
case 2: retiraLivro(); break;
case 3: devolveLivro(); break;
case 4: status(); break;
case 5: return;
default: cout <<"Opcao errada, tente novamente: ";
}
}
}