Re: Classes: Reading in data? Using constructors?
Upon following your suggestions, Jonathan Mcdougall, my program will
not compile. I get a lot of errors:
6 C:\CIS\22\asn2\asn2.cpp In file included from C:\CIS\22\asn2\asn2.cpp
31 C:\CIS\22\asn2\library.hpp prototype for `const std::string
Book::getNcopies() const' does not match any in class `Book'
13 C:\CIS\22\asn2\library.hpp int Book::getNcopies() const
31 C:\CIS\22\asn2\library.hpp `const std::string Book::getNcopies()
const' and `int Book::getNcopies() const' cannot be overloaded
C:\CIS\22\asn2\library.hpp In member function `const std::string
Book::getNcopies() const':
32 C:\CIS\22\asn2\library.hpp initializing argument 1 of
`std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const
_CharT*, const _Alloc&) [with _CharT = char, _Traits =
std::char_traits<char>, _Alloc = std::allocator<char>]'
32 C:\CIS\22\asn2\library.hpp At global scope:
35 C:\CIS\22\asn2\library.hpp prototype for `const std::string
Book::getOnLoan() const' does not match any in class `Book'
14 C:\CIS\22\asn2\library.hpp int Book::getOnLoan() const
35 C:\CIS\22\asn2\library.hpp `const std::string Book::getOnLoan()
const' and `int Book::getOnLoan() const' cannot be overloaded
C:\CIS\22\asn2\library.hpp In member function `const std::string
Book::getOnLoan() const':
36 C:\CIS\22\asn2\library.hpp invalid conversion from `const int' to
`const char*'
36 C:\CIS\22\asn2\library.hpp initializing argument 1 of
`std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const
_CharT*, const _Alloc&) [with _CharT = char, _Traits =
std::char_traits<char>, _Alloc = std::allocator<char>]'
C:\CIS\22\asn2\asn2.cpp In function `int main()':
12 C:\CIS\22\asn2\asn2.cpp `readLibrary' undeclared (first use this
function)
(Each undeclared identifier is reported only once for each function
it appears in.)
C:\CIS\22\asn2\asn2.cpp In function `void readLibrary(Library&)':
17 C:\CIS\22\asn2\asn2.cpp `void readLibrary(Library&)' used prior to
declaration
59 C:\CIS\22\asn2\asn2.cpp `load' undeclared (first use this function)
C:\CIS\22\asn2\library.hpp In function `void printFull(Library&)':
4 C:\CIS\22\asn2\library.hpp `std::string Book::title' is private
69 C:\CIS\22\asn2\asn2.cpp within this context
69 C:\CIS\22\asn2\asn2.cpp no match for call to `(std::string) ()'
3 C:\CIS\22\asn2\library.hpp `std::string Book::author' is private
70 C:\CIS\22\asn2\asn2.cpp within this context
70 C:\CIS\22\asn2\asn2.cpp no match for call to `(std::string) ()'
My code is:
library.hpp
----------------
class Book {
private:
std::string author;
std::string title;
std::string code;
int ncopies;
int onloan;
public:
Book( const std::string &auth, const std::string &tit,
const std::string &cd, int ncop, int nonload = 0 );
const std::string &getAuthor( ) const;
const std::string &getTitle( ) const;
const std::string &getCode( ) const;
int getNcopies( ) const;
int getOnLoan( ) const;
void Borrow( int qty );
void nReturn( int qty );
};
const std::string &Book::getAuthor( ) const {
return author;
}
const std::string &Book::getTitle( ) const {
return title;
}
const std::string &Book::getCode( ) const {
return code;
}
const std::string Book::getNcopies( ) const {
return ncopies;
}
const std::string Book::getOnLoan( ) const {
return onloan;
}
----------------
asn2.cpp
----------------
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include "library.hpp"
typedef std::vector<Book> Library;
int main( ) {
Library lib;
readLibrary( lib );
return 0;
}
void readLibrary( Library &lib ) {
// open the file
std::ifstream ifs("books.dat");
// we'll detect EOF inside
while( true ) {
// string values from the data file
// copies and load have a _s suffix (string)
// because they are temporary objects
// they will be converted to ints later on
std::string title, author, code, copies_s, loan_s;
// get five lines
getline(ifs, title);
getline(ifs, author);
getline(ifs, code);
getline(ifs, copies_s);
getline(ifs, loan_s);
// if we were at the end of file,
// or if there was any problems,
// one of the calls to getline() failed.
// we check it here
if (!ifs)
break;
// istringstream is useful for
// converting strings to integers
std::istringstream iss;
// convert copies_s to an int
int copies = 0;
iss.str(copies_s);
iss >> copies;
// convert loan_s to an int
int loan = 0;
iss.str(loan_s);
iss >> loan;
// create the book and add it
// to the library
lib.push_back(Book(title, author, code, copies, load));
}
return;
}
void printFull( Library &lib ) {
for (Library::iterator itor=lib.begin(); itor!=lib.end(); ++itor)
{
Book& b = *itor;
std::cout
<< "Title: " << b.title( ) << "\n"
<< "Author: " << b.author( ) << "\n";
}
return;
}
----------------
Any ideas why?