S
Sam Hu
Dir Sirs,
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:stream& operator<<(std:stream&, 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:stream& graduate::sendto(std:stream&) 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
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:stream& operator<<(std:stream&, 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:stream& graduate::sendto(std:stream&) 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