易宏 2017-11-23 14:32 采纳率: 0%
浏览 1147

在visual c++6.0编译没有问题,可是在visual studio中编译报错,麻烦帮我看看

报错的地方用粗体标记出来了

#include
#include
#include
#include

using namespace std;

class Patron; // forward declaration;

class Book {
public:
Book() {
patron = 0;
}
bool operator== (const Book& bk) const {
return strcmp(title, bk.title) == 0;
}
private:
char *title;
Patron *patron;
ostream& printBook(ostream&) const;
friend ostream& operator<< (ostream& out, const Book& bk) {
return bk.printBook(out);
}
friend class CheckedOutBook;
friend Patron;
friend void includeBook();
friend void checkOutBook();
friend void returnBook();
};

class Author {
public:
Author() {
}
bool operator== (const Author& ar) const {
return strcmp(name, ar.name) == 0;
}
private:
char *name;
list books;
ostream& printAuthor(ostream&) const;
friend ostream& operator<< (ostream& out, const Author& ar) {
return ar.printAuthor(out);
}
friend void includeBook();
friend void checkOutBook();
friend void returnBook();
friend class CheckedOutBook;
friend Patron;
};

class CheckedOutBook {
public:
CheckedOutBook(list::iterator ar=0,
list::iterator bk=0 )
//报错
{
author = ar;
book = bk;
}
bool operator== (const CheckedOutBook& bk) const {
return strcmp(author->name, bk.author->name) == 0 &&
strcmp(book->title, bk.book->title) == 0;
}
private:
list::iterator author;
list::iterator book;
friend void checkOutBook();
friend void returnBook();
friend Patron;
};

class Patron {
public:
Patron() {
}
bool operator== (const Patron& pn) const {
return strcmp(name, pn.name) == 0;
}
private:
char *name;
list books;
ostream& printPatron(ostream&) const;
friend ostream& operator<< (ostream& out, const Patron& pn) {
return pn.printPatron(out);
}
friend void checkOutBook();
friend void returnBook();
friend Book;
};

list catalog['Z' + 1];
list people['Z' + 1];

ostream& Author::printAuthor(ostream& out) const {
out << name << endl;
list::const_iterator ref = books.begin();
for (; ref != books.end(); ref++)
out << *ref; // overloaded <<
return out;
}

ostream& Book::printBook(ostream& out) const {
out << " * " << title;
if (patron != 0)
out << " - checked out to " << patron->name; // overloaded <<
out << endl;
return out;
}

ostream& Patron::printPatron(ostream& out) const {
out << name;
if (!books.empty()) {
out << " has the following books:\n";
list::const_iterator bk = books.begin();
for (; bk != books.end(); bk++)
out << " * " << bk->author->name << ", "
<< bk->book->title << endl;
}
else out << " has no books\n";
return out;
}

template
ostream& operator<< (ostream& out, const list& lst) {
for (list::const_iterator ref = lst.begin(); ref != lst.end(); ref++)
out << *ref; // overloaded <<
return out;
}

char* getString(char *msg) {
char s[82], i, *destin;
cout << msg;
cin.get(s, 80);
while (cin.get(s[81]) && s[81] != '\n'); // discard overflowing
destin = new char[strlen(s) + 1]; // characters;
for (i = 0; destin[i] = toupper(s[i]); i++);
return destin;
}

void status() {
register int i;
cout << "Library has the following books:\n\n";
for (i = 'A'; i <= 'Z'; i++)
if (!catalog[i].empty())
cout << catalog[i];
cout << "\nThe following people are using the library:\n\n";
for (i = 'A'; i <= 'Z'; i++)
if (!people[i].empty())
cout << people[i];
}

void includeBook() {
Author newAuthor;
Book newBook;
newAuthor.name = getString("Enter author's name: ");
newBook.title = getString("Enter the title of the book: ");
list::iterator oldAuthor =
find(catalog[newAuthor.name[0]].begin(),
catalog[newAuthor.name[0]].end(), newAuthor);
if (oldAuthor == catalog[newAuthor.name[0]].end()) {
newAuthor.books.push_front(newBook);
catalog[newAuthor.name[0]].push_front(newAuthor);
}
else (*oldAuthor).books.push_front(newBook);
}

void checkOutBook() {
Patron patron;
Author author;
Book book;
list::iterator authorRef;
list::iterator bookRef;
patron.name = getString("Enter patron's name: ");
while (true) {
author.name = getString("Enter author's name: ");
authorRef = find(catalog[author.name[0]].begin(),
catalog[author.name[0]].end(), author);
if (authorRef == catalog[author.name[0]].end())
cout << "Misspelled author's name\n";
else break;
}
while (true) {
book.title = getString("Enter the title of the book: ");
bookRef = find((*authorRef).books.begin(),
(*authorRef).books.end(), book);
if (bookRef == (*authorRef).books.end())
cout << "Misspelled title\n";
else break;
}
list::iterator patronRef;
patronRef = find(people[patron.name[0]].begin(),
people[patron.name[0]].end(), patron);
CheckedOutBook checkedOutBook(authorRef, bookRef);
if (patronRef == people[patron.name[0]].end()) { // a new patron
patron.books.push_front(checkedOutBook); // in the library;
people[patron.name[0]].push_front(patron);
(*bookRef).patron = &*people[patron.name[0]].begin();
}
else {
(*patronRef).books.push_front(checkedOutBook);
(*bookRef).patron = &*patronRef;
}
}

void returnBook() {
Patron patron;
Book book;
Author author;
list::iterator patronRef;
list::iterator bookRef;
list::iterator authorRef;
while (true) {
patron.name = getString("Enter patron's name: ");
patronRef = find(people[patron.name[0]].begin(),
people[patron.name[0]].end(), patron);
if (patronRef == people[patron.name[0]].end())
cout << "Patron's name misspelled\n";
else break;
}
while (true) {
author.name = getString("Enter author's name: ");
authorRef = find(catalog[author.name[0]].begin(),
catalog[author.name[0]].end(), author);
if (authorRef == catalog[author.name[0]].end())
cout << "Misspelled author's name\n";
else break;
}
while (true) {
book.title = getString("Enter the title of the book: ");
bookRef = find((*authorRef).books.begin(),
(*authorRef).books.end(), book);
if (bookRef == (*authorRef).books.end())
cout << "Misspelled title\n";
else break;
}
CheckedOutBook checkedOutBook(authorRef, bookRef);
(*bookRef).patron = 0;
(*patronRef).books.remove(checkedOutBook);
}

int menu() {
int option;
cout << "\nEnter one of the following options:\n"
<< "1. Include a book in the catalog\n2. Check out a book\n"
<< "3. Return a book\n4. Status\n5. Exit\n"
<< "Your option? ";
cin >> option;
cin.get(); // discard '\n';
return option;
}

int main() {
while (true)
switch (menu()) {
case 1: includeBook(); break;
case 2: checkOutBook(); break;
case 3: returnBook(); break;
case 4: status(); break;
case 5: return 0;
default: cout << "Wrong option, try again: ";
}
return 0;
}

  • 写回答

1条回答 默认 最新

  • errors5835 2017-11-23 16:01
    关注

    忘记自己定义那个报错函数体的构造函数了,你报错的问题是这个,就是不知道有没有其他的问题

    评论

报告相同问题?

悬赏问题

  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致