new and delete help for classes
I have an array of pointers to class Shape.
I create 4 items and display their values.
shapes[0 - 3]
Shape *shapes[SIZE];
shapes[0] = new Shape (p1);
shapes[1] = new Triangle (p1);
shapes[2] = new Polygon (p2);
p2.push_back( Point( 210, 210) );
shapes[3] = new Polygon (p2);
sListSize = 4;
// --== This is what is causing my program to crash - but why? ==--
// Please help
for(int i = 0; i < sListSize; i ++)
delete shapes[i];
But when I try to delete them, The program crashes after item 0.
Please find attached the code below:
//----------------------------------------------------------------------------------------------------------
// .h file
//----------------------------------------------------------------------------------------------------------
class Point
{
public:
int x, y;
Colour col;
public:
Point(void) { x = y = 100; col.r = col.g = col.b = 255; }
Point(int iX, int iY, Colour iCol);
Point(int iX, int iY);
string GetInfo(void);
// operators
Point operator=(const Point &rhs);
bool operator==(const Point &rhs);
bool operator!=(const Point &rhs);
bool operator<( const Point & rhs) { return this->y < rhs.y; }
};
class Shape
{
public:
vector<Point> pL;
vector<Line> eL;
public:
Shape(vector<Point> pList) : pL(pList) { cout << "Shape constructor" <<
endl; }
Shape(void) {}
~Shape() { cout << "Shape Destructor" << endl; }
// Member functions
void SetColour(Colour);
// Virtual functions
virtual string GetInfo(void);
virtual void Draw(void);
// Sorting routines
void SortOnY(void);
void SortOnX(void);
};
class Triangle : virtual public Shape
{
public:
Triangle(vector<Point> pList, unsigned int fType = 0) :
Shape(pList), fillType(fType) { SortOnY(); cout << "Triangle constructor"
<< endl; }
~Triangle() { cout << "Triangle destructor" << endl; }
void Draw(void);
string GetInfo(void);
private:
unsigned int fillType;
};
// Member of Shape and Triangle
class Polygon : virtual public Shape, public Triangle
{
public:
Polygon(vector<Point> pList, unsigned int fType = 0) :
Triangle(pList, fType), Shape(pList) { SortOnX(); }
~Polygon() { cout << "Polygon destructor" << endl; }
void Draw(void);
string GetInfo(void);
};
//----------------------------------------------------------------------------------------------------------
// .cpp file
//----------------------------------------------------------------------------------------------------------
Point::Point(int iX, int iY, Colour iCol)
{
x = iX;
y = iY;
col = iCol;
}
Point::Point(int iX, int iY)
{
x = iX;
y = iY;
col.r = col.b = col.g = 255;
}
string Point::GetInfo(void)
{
string s;
char buff[200];
sprintf(buff, "Point (%3d,%3d) - Col_RGB: [%3d,%3d,%3d]", x, y, col.r,
col.g, col.b);
s = buff;
return(s);
}
Point Point::operator=(const Point &rhs)
{
if(this == &rhs)
return(*this);
x = rhs.x;
y = rhs.y;
col = rhs.col;
return(*this);
}
bool Point::operator==(const Point &rhs)
{
if(rhs.x == x && rhs.y == y)
return(true);
else
return(false);
}
bool Point::operator!=(const Point &rhs)
{
if(rhs.x != x && rhs.y != y)
return(true);
else
return(false);
}
// ------------------------------------------------------------------
// --== LINE ==--
// ------------------------------------------------------------------
// LINE --> Constructor 1
Line::Line(Point iP1, Point iP2)
{
p1 = iP1;
p2 = iP2;
}
string Line::GetInfo(void)
{
string s;
char buff[200];
return(s);
}
// ------------------------------------------------------------------
// --== SHAPE ==--
// ------------------------------------------------------------------
// Sorting functions
bool lessX(const Point &p1, const Point &p2) { return(p1.x < p2.x); }
bool lessY(const Point &p1, const Point &p2) { return(p1.y < p2.y); }
void Shape::SortOnX(void) { sort (pL.begin(), pL.end(), lessX); }
void Shape::SortOnY(void) { sort (pL.begin(), pL.end(), lessY); }
void Shape::SetColour(Colour c)
{
for(int i = 0; i < pL.size(); i ++)
pL[i].col = c;
}
string Shape::GetInfo(void)
{
string s;
char buff[200];
sprintf( buff, "Shape - pointCnt: %d", pL.size() );
s = buff;
for(int i = 0; i < pL.size(); ++ i)
s += string("\n\t") + pL[i].GetInfo().c_str();
return(s);
}
void Shape::Draw(void) { cout << "Shape Draw" << endl; }
// ------------------------------------------------------------------
// --== SHAPE ==--
// ------------------------------------------------------------------
void Triangle::Draw() { cout << "Triangle Draw" << endl; }
string Triangle::GetInfo(void)
{
string s;
char buff[200];
s = "Triangle - ";
sprintf(buff, "FillType: %d\n", fillType);
s += buff;
s += Shape::GetInfo().c_str();
return(s);
}
void Polygon::Draw(void)
{
cout << "Polygon Draw" << endl;
Triangle::Draw();
}
string Polygon::GetInfo(void)
{
string s;
s = "Polygon - GetInfo";
s += Triangle::GetInfo().c_str();
return(s);
}
//----------------------------------------------------------------------------------------------------------
// .cpp MAIN file
//----------------------------------------------------------------------------------------------------------
int sListSize = 0;
Shape *shapes[SIZE];
vector<Point> p1;
p1.push_back( Point(10, 10) );
p1.push_back( Point(100, 100) );
p1.push_back( Point(20, 20) );
shapes[0] = new Shape (p1);
shapes[1] = new Triangle (p1);
vector<Point> p2;
p2.push_back( Point(10, 10) );
p2.push_back( Point(100, 100) );
p2.push_back( Point(20, 20) );
p2.push_back( Point( 200, 200) );
//shapes[2] = new Polygon (p2);
shapes[2] = new Polygon (p2);
p2.push_back( Point(450, 120) );
shapes[3] = new Polygon (p2);
sListSize = 4;
cout << "\nDoing the old pointer list method: " << endl;
for(int i = 0; i < sListSize; i ++)
{
cout << "\n" << "I: " << i << " " << shapes[i]->GetInfo().c_str() << endl;
shapes[i]->Draw();
}
cout << "\n--== DELETING MEMORY ==--\n";
cout << "Size: " << sListSize << endl;
for(int i = 0; i < sListSize; i ++)
{
cout << "DEL: " << i << endl;
delete shapes[i]; // --== This is causing me problems ==--
}