-
could you explain this?
Code:
//Listing 14.7. Shape classes.
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
class Shape
{
public:
Shape(){}
virtual ~Shape(){}
virtual long GetArea() { return -1; } // error
virtual long GetPerim() { return -1; }
virtual void Draw() {}
private:
};
class Circle : public Shape
{
public:
Circle(int radius):itsRadius(radius){}
~Circle(){}
long GetArea() { return 3 * itsRadius * itsRadius; }
long GetPerim() { return 6 * itsRadius; }
void Draw();
private:
int itsRadius;
int itsCircumference;
};
void Circle::Draw()
{
cout << "Circle drawing routine here!\n";
}
class Rectangle : public Shape
{
public:
Rectangle(int len, int width):
itsLength(len), itsWidth(width){}
virtual ~Rectangle(){}
virtual long GetArea() { return itsLength * itsWidth; }
virtual long GetPerim() {return 2*itsLength + 2*itsWidth; }
virtual int GetLength() { return itsLength; }
virtual int GetWidth() { return itsWidth; }
virtual void Draw();
private:
int itsWidth;
int itsLength;
};
void Rectangle::Draw()
{
for (int i = 0; i<itsLength; i++)
{
for (int j = 0; j<itsWidth; j++)
cout << "x ";
cout << "\n";
}
}
class Square : public Rectangle
{
public:
Square(int len);
Square(int len, int width);
~Square(){}
long GetPerim() {return 4 * GetLength();}
};
Square::Square(int len):
Rectangle(len,len)
{}
Square::Square(int len, int width):
Rectangle(len,width)
{
if (GetLength() != GetWidth())
cout << "Error, not a square... a Rectangle??\n";
}
int main()
{
int choice;
bool fQuit = false;
Shape * sp;
while ( !fQuit )
{
cout << "(1)Circle (2)Rectangle (3)Square (0)Quit: ";
cin >> choice;
switch (choice)
{
case 0: fQuit = true;
break;
case 1: sp = new Circle(5);
break;
case 2: sp = new Rectangle(4,6);
break;
case 3: sp = new Square(5);
break;
default: cout<<"Please enter a number between 0 and 3"<<endl;
continue;
break;
}
if( !fQuit )
sp->Draw();
delete sp;
sp = 0;
cout << "\n";
}
int exit;cin>>exit;
return 0;
}
I don't see the defition for the rectangle constructor.....please explain.........
-
never mind I see it now.....it's just a little bit different that usual (for the book)
Rectangle(int len, int width):
itsLength(len), itsWidth(width){}
-
I sure am glad you spotted it. It's a bit hidden.
-
The author didn't exactly try to hide it, it's where the constructor usually is placed (as the first public method). Of course I would have done it a different way when using an initializer list, either make the definition global and comment so that everything is nice and neat and easy to find:
Code:
// Constructor fleshy
Rectangle::Rectangle(int len, int width):
itsLength(len), itsWidth(width)
{
}
or put it all on one line inside the class so that it's easier to read:
Code:
Rectangle(int len, int width): itsLength(len), itsWidth(width) {}
It was probably broken into two lines for space sake, but to some that would make it very difficult to follow, especially people who don't see initializer lists often.
-Prelude
-
Yeah I guess that's what confused me a bit, because I wasn't really used to see the constructor definition like that.