简体   繁体   中英

operators in C++ class

I have the following code and it keeps giving me errors and I'm not really sure what to do because i have the operators declared.

#ifndef BOOK_H
#define BOOK_H
#include<vector>
#include<string>
using namespace std;
class Book {
public:
    Book();
    Book(vector<string>*, string, int);
    Book(const Book&);
    ~Book();
    Book& operator=(const Book&);
    void update(vector<string>*);
    void update(string); 
    void update(int); 
    int getYear() const{
        return year;
    };
    string getTitle() const{
        return title;
    };
    bool operator==(const Book&);
    bool operator!=(const Book&);
    friend ostream& operator<<(ostream&, const Book&);
    void getAuthors();
private:
    vector<string>* authors;
    string title;
    int year;
};

#endif


#include "Book.h"
#include <vector>
#include <string>
#include <cstdlib>
using namespace std;
Book::Book():year(0), title(NULL), authors(NULL){}
Book::Book(vector<string>* bookauthors,string booktitle, int bookyear ){
    authors = bookauthors;
    title = booktitle;
    year = bookyear;
}
Book::Book(const Book& aBook){
    authors = aBook.authors;
    title = aBook.title;
    year = aBook.year;
}
bool Book::operator==(const Book &aBook){
    if(getYear() == aBook.getYear() && getTitle() == aBook.getTitle())
        return true;
    else return false;
}
bool Book::operator != (const Book &aBook){
    if(getYear() != aBook.getYear() && getTitle() == aBook.getTitle())
        return true;
    else return false;
}
Book& Book::operator =(const Book& rhs){
    if(this != rhs){
        authors = rhs.authors;
        title = rhs.title;
        year = rhs.year;
    }
    return *this;
}
void Book::update(int newyear){
    year = newyear;
}
void Book::update(string newtitle){
    title = newtitle;    
}
void Book::update(vector<string>* newauthors){
    authors = newauthors;
}
ostream& operator<<(ostream& os, const Book& b){
    os<<b.getTitle()<<"/"<<b.getYear();
    return os;
}

and i keep getting this error and i'm not sure how to fix it.

Book.cc: In member function 'Book& Book::operator=(const Book&)':
Book.cc:28: error: no match for 'operator!=' in 'this != rhs'
Book.cc: In function 'std::ostream& operator<<(std::ostream&, const Book&)':
Book.cc:45: error: no match for 'operator<<' in 'std::operator<< [with _CharT = char,   _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((std::basic_ostream<char,   std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)os)), ((const  std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& Book::getTitle()  const())))) << "/"'
Book.cc:44: note: candidates are: std::ostream& operator<<(std::ostream&, const Book&)

Thanks for the help.

Replace

bool operator==(const Book&);
bool operator!=(const Book&);
friend ostream& operator<<(ostream&, const Book&);

by

bool operator==(const Book&) const;
bool operator!=(const Book&) const;
friend std::ostream& operator<<(std::ostream&, const Book&);

And when checking for equality, try

if (this != &rhs)

or

if (*this != rhs)

depending on whether you want to do a deep or a shallow compare.

For the first error, you are comparing this , which is a Book pointer, to a Book reference. You need to compare this to the address of the argument, ie compare pointers:

if(this != &rhs){ .... }

Concerning the second error, I see nothing wrong in the code you posted. However, you don't need to declare the ostream& << operator as friend, since it only accesses public methods.

You should also make your comparison operators == and != const , although this is unrelated to the errors you report.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM