This is just a question from a C++ newbie regarding the operator
overloading.Since I do not want to use friend key word,I write class
graduate as below:
//graduate.h
#ifndef GRADUATE_H
#define GRADUATE_H
#include <iostream>
#include <string>
using namespace std;
class graduate
{
public:
/** Default constructor */
graduate();
string getDegree() const;
bool isEqual(const graduate& rhs);
bool lessThan(const graduate& rhs);
istream& getfrom(istream& istr)const;
ostream& sendto(ostream& ostr)const;
protected:
private:
string name;
string degree;
};
bool operator==(const graduate& lhs,graduate& rhs)
{
return lhs.isEqual(rhs);
}
bool operator<(const graduate& lhs,graduate& rhs)
{
return lhs.lessThan(rhs);
}
istream& operator>>(istream& istr,const graduate& grad)const
{
return grad.getfrom(istr);
}
ostream& operator<<(ostream& ostr,const graduate& grad)const
{
return grad.sendto(ostr);
}
graduate::graduate()
{
//ctor
}
/** @brief getDegree
*
* @todo: document this function
*/
string graduate::getDegree() const
{
return degree;
}
/** @brief getfrom
*
* @todo: document this function
*/
istream & graduate::getfrom(istream& istr)const
{
char ch;
istr>>this.name;
istr>>ch;
istr>>this.degree;
return istr;
}
/** @brief isEqual
*
* @todo: document this function
*/
bool graduate::isEqual(const graduate& rhs)
{
return this.name==rhs.name;
}
/** @brief sendto
*
* @todo: document this function
*/
ostream & graduate::sendto(ostream& ostr)const
{
ostr<<"Name:"<< this.name<<"\tdegree:"<<this.degree<<endl;
return ostr;
}
/** @brief lessThan
*
* @todo: document this function
*/
bool graduate::lessThan(const graduate& rhs)
{
return this.name<rhs.name;
}
#endif // GRADUATE_H
//end of graduate.h
Compiler generates a lot of error message:
F:\CodeBlocksProject\listApp\graduate.h||In function `bool operator==
(const graduate&, graduate&)':|
F:\CodeBlocksProject\listApp\graduate.h|28|error: passing `const
graduate' as `this' argument of `bool graduate::isEqual(const
graduate&)' discards qualifiers|
F:\CodeBlocksProject\listApp\graduate.h||In function `bool operator<
(const graduate&, graduate&)':|
F:\CodeBlocksProject\listApp\graduate.h|32|error: passing `const
graduate' as `this' argument of `bool graduate::lessThan(const
graduate&)' discards qualifiers|
F:\CodeBlocksProject\listApp\graduate.h|36|error: non-member function
`std::istream& operator>>(std::istream&, const graduate&)' cannot have
`const' method qualifier|
F:\CodeBlocksProject\listApp\graduate.h|40|error: non-member function
`std::ostream& operator<<(std::ostream&, const graduate&)' cannot have
`const' method qualifier|
F:\CodeBlocksProject\listApp\graduate.h||In member function
`std::istream& graduate::getfrom(std::istream&) const':|
F:\CodeBlocksProject\listApp\graduate.h|63|error: request for member
`name' in `this', which is of non-class type `const graduate* const'|
F:\CodeBlocksProject\listApp\graduate.h|65|error: request for member
`degree' in `this', which is of non-class type `const graduate*
const'|
F:\CodeBlocksProject\listApp\graduate.h||In member function `bool
graduate::isEqual(const graduate&)':|
F:\CodeBlocksProject\listApp\graduate.h|77|error: request for member
`name' in `this', which is of non-class type `graduate* const'|
F:\CodeBlocksProject\listApp\graduate.h||In member function
`std::ostream& graduate::sendto(std::ostream&) const':|
F:\CodeBlocksProject\listApp\graduate.h|86|error: request for member
`name' in `this', which is of non-class type `const graduate* const'|
F:\CodeBlocksProject\listApp\graduate.h|86|error: request for member
`degree' in `this', which is of non-class type `const graduate*
const'|
F:\CodeBlocksProject\listApp\graduate.h||In member function `bool
graduate::lessThan(const graduate&)':|
F:\CodeBlocksProject\listApp\graduate.h|95|error: request for member
`name' in `this', which is of non-class type `graduate* const'|
||=== Build finished: 10 errors, 0 warnings ===|
Could anybody here help ?
Thanks and best regards,
Sam
> bool isEqual(const graduate& rhs);
> bool lessThan(const graduate& rhs);
These two member functions should be declared as const, because they
will not modify *this.
>
> istream& getfrom(istream& istr)const;
This member function must NOT be declared as const.
> ostream& sendto(ostream& ostr)const;
>
> protected:
As there are no protected members, you can leave this line out.
> private:
> string name;
> string degree;};
>
> bool operator==(const graduate& lhs,graduate& rhs)
For symmetry, and because neither operand will get changed, you should
declare both parameters as const (reference).
> {
> return lhs.isEqual(rhs);}
>
> bool operator<(const graduate& lhs,graduate& rhs)
Same here.
> {
> return lhs.lessThan(rhs);
>
> }
>
> istream& operator>>(istream& istr,const graduate& grad)const
Both consts here are an error.
The 'const graduate& grad' is an error, because you actually want to
change the object with the information you read from the stream.
The const at the end is an error, because your operator>> is not a
member function, and const in that position is only allowed for member
functions.
> {
> return grad.getfrom(istr);}
>
> ostream& operator<<(ostream& ostr,const graduate& grad)const
Same problem with the const at the end.
> {
> return grad.sendto(ostr);}
>
> graduate::graduate()
> {
> //ctor}
>
> /** @brief getDegree
> *
> * @todo: document this function
> */
> string graduate::getDegree() const
> {
> return degree;
>
> }
>
> /** @brief getfrom
> *
> * @todo: document this function
> */
> istream & graduate::getfrom(istream& istr)const
As said before, this function should be non-const, because it changes
*this.
> {
> char ch;
> istr>>this.name;
this is a pointer, so you need this->name to access the name member.
> istr>>ch;
> istr>>this.degree;
> return istr;
>
> }
>
<snip>
> Could anybody here help ?
> Thanks and best regards,
> Sam
Bart v Ingen Schenau
(Note also you should check that this has actually worked too!)
> return istr;
>
>
> }
>
> /** @brief isEqual
> *
> * @todo: document this function
> */
> bool graduate::isEqual(const graduate& rhs)
bool graduate::isEqual(const graduate& rhs) const
> {
> return this.name==rhs.name;
return this->name==rhs.name;
> }
>
> /** @brief sendto
> *
> * @todo: document this function
> */
> ostream & graduate::sendto(ostream& ostr)const
> {
> ostr<<"Name:"<< this.name<<"\tdegree:"<<this.degree<<endl;
ostr<<"Name:"<< this->name<<"\tdegree:"<<this->degree<<endl;
> return ostr;
> }
> /** @brief lessThan
> *
> * @todo: document this function
> */
> bool graduate::lessThan(const graduate& rhs)
bool graduate::lessThan(const graduate& rhs) const
> {
> return this.name<rhs.name;
return this->name<rhs->name;
I think that's all of them, haven't actually compiled it though.
You could just make the operator== and operator< member functions though.
Alan
Thanks and best regards,
Sam