'Printing a message from a base class function through the operator <<
This is the header file with class Rectangle
that inherits from class Shape
:
class Rectangle: public Shape {
private:
double width;
double height;
protected:
// overrides the base class's toString implementation.
// returns a string representation of the class. The method returns the value of id, name, width, height separated by an @:
// <<value of id>>@<<value of name>>@<<value of width>>@<<value of height>>
// note that you must reuse the base class's toString implementation. Don't repeat code from the base class
string toString() const;
Now this is a an operator<<
from class Rectangle
:
// Overloads the standard output stream operator to print the message from toString() to the standard output stream
friend ostream& operator<<(ostream &os, const Rectangle *rectangle);
This is my code for the Rectangle.cpp
:
ostream& operator<<(ostream& os, Rectangle* rectangle) {
os << *rectangle.toString();
return os;
}
It's telling me that the expression must have a class type. Please help.
BTW, this is the toString()
function that I declared in the Rectangle.cpp
:
string Rectangle::toString() const {
return to_string(this->id) + "@" + this->name + "@" + to_string(this->width) + to_string(this->height);
}
Solution 1:[1]
The problem is that you've made the second parameter of the overloaded operator<<
to be a pointer(const Rectangle *
) whereas it should be a reference(const Rectangle &
) as shown below. Note that this is a problem because due to operator precedence the expression *rectangle.toString()
is equivalent to:
*(rectangle.toString()) //equivalent to this because of operator precedence
But the above can't work as rectangle
is a pointer type.
Additionally, you were missing a low-level const
in the second parameter of the overloaded operator<<
while defining it. This is also fixed in the below shown demo.
Solution
There are two ways to solve this. You can either make the second parameter a const Rectangle&
or change the expression *rectangle.toString()
to rectangle->toString()
.
Method 1
class Rectangle{
//------------------------------------------------------v------------>note the lvalue reference
friend ostream& operator<<(ostream &os, const Rectangle &rectangle);
//other code here
}
//------------------------------vvvvv-----------v--------------->const and & added here
ostream& operator<<(ostream& os,const Rectangle& rectangle) {
os << rectangle.toString();
//-------^------------------------>removed the * from here
return os;
}
Method 2
//------------------------------vvvvv-------------------------->const added here
ostream& operator<<(ostream& os,const Rectangle* rectangle) {
os << rectangle->toString();
//-----------------^^---------------> here we have used ->
return os;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |