Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

operator overloading simple question

0 views
Skip to first unread message

Sam Hu

unread,
Mar 27, 2009, 5:49:19 AM3/27/09
to
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::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

Bart van Ingen Schenau

unread,
Mar 27, 2009, 6:30:39 AM3/27/09
to
On Mar 27, 10:49 am, Sam Hu <SamHu.Sa...@gmail.com> wrote:
> 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);

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

Alan Woodland

unread,
Mar 27, 2009, 6:49:22 AM3/27/09
to
Sam Hu wrote:
> 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;
const string& getDegree() const;
> bool isEqual(const graduate& rhs);
bool isEqual(const graduate& rhs) const ;
> bool lessThan(const graduate& rhs);
bool lessThan(const graduate& rhs) const;

>
> 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
istream& operator>>(istream& istr,const graduate& grad)
> {
> return grad.getfrom(istr);
> }
> ostream& operator<<(ostream& ostr,const graduate& grad)const
ostream& operator<<(ostream& ostr,const graduate& grad)
> {
> return grad.sendto(ostr);
> }
> graduate::graduate()
> {
> //ctor
> }
> /** @brief getDegree
> *
> * @todo: document this function
> */
> string graduate::getDegree() const
const string& graduate::getDegree() const

> {
> return degree;
> }
>
> /** @brief getfrom
> *
> * @todo: document this function
> */
> istream & graduate::getfrom(istream& istr)const
> {
> char ch;
> istr>>this.name;
istr >> this->name
> istr>>ch;
> istr>>this.degree;
istr>>this->degree

(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

Sam Hu

unread,
Mar 29, 2009, 10:14:38 PM3/29/09
to
Thank you so much for all your help,both!And now I have a better
understanding how come C++ is called the most complicated language in
the world!!And here I have one more questions:why we need both const &
non-const version ,and under what situation these 2 are mandatory and
what situation we can just pick one of the 2?

> bool isEqual(const graduate& rhs) const ;
>         bool lessThan(const graduate& rhs);

Thanks and best regards,
Sam

0 new messages