Thursday, August 8, 2019

c++ - Undefined reference to vtable while implementing virtual functions

I try to implement examples of "C++ An Introduction To Programming" by Jesse Liberty and Tim Keogh but on implementing pure virtual functions is compiling but not building. It is giving the error : undefined reference to 'vtable for circle'




I have tried substituting the variable itsRadius for a virtual function GetItsRadius to see if it would work but it started giving me the same errors in the switch statement but for Rectangle and Square and also the same error as before for circle.



Here is the code:



#include 

using namespace std;

enum BOOL { FALSE, TRUE };


class Shape
{
public:
Shape(){}
~Shape(){}
virtual long GetArea() = 0; // error
virtual long GetPerim()= 0;
virtual void Draw() = 0;
private:
};


void Shape::Draw()
{
cout << "Abstract drawing mechanism!\n";
}

class Circle : public Shape
{
public:
Circle(int radius):itsRadius(radius){}

~Circle(){}
long GetArea() { return 3 * itsRadius * itsRadius; }
long GetPerim() { return 9 * itsRadius; }
void Draw();
private:
int itsRadius;
int itsCircumference;
};

class Rectangle : public Shape

{
public:
Rectangle(int len, int width):
itsLength(len), itsWidth(width){}
~Rectangle(){}
long GetArea() { return itsLength * itsWidth; }
long GetPerim() { return 2*itsLength + 2*itsWidth; }
virtual int GetLength() { itsLength; }
virtual int GetWidth() { itsWidth; }
void Draw();

private:
int itsWidth;
int itsLength;
};

void Rectangle::Draw()
{
for (int i = 0; i {
for (int j = 0; j
cout << "x ";

cout << "\n";
}
Shape::Draw();
}

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";
}

void startof()
{
int choice;

BOOL fQuit = FALSE;
Shape * sp;

while (1)
{
cout << "(1)Circle (2)Rectangle (3)Square (0)Quit: \n";
cin >> choice;

switch (choice)
{

case 1: sp = new Circle(5);
break;
case 2: sp = new Rectangle(4,6);
break;
case 3: sp = new Square (5);
break;
default: fQuit = TRUE;
break;
}
if (fQuit)

break;

sp->Draw();
cout << "\n";
}
}


int main()
{

startof();
}

No comments:

Post a Comment

hard drive - Leaving bad sectors in unformatted partition?

Laptop was acting really weird, and copy and seek times were really slow, so I decided to scan the hard drive surface. I have a couple hundr...