Сейчас я работаю над наследованием. У меня есть базовый класс Shape, а несколько других - подкласс. Ошибка компиляции отсутствует. Но после того, как я введу все координаты, всплывает ошибка сегментации. Внутри класса драйвера параметр, когда я пытался использовать этот d [count].toString();
Shape.h
class Shape
{
protected:
string name;
bool containsWarpSpace;
public:
Shape();
Shape(string, bool);
string toString();
virtual double computeArea();
void setName (string);
// some other codes here
};
Square.h
class Square : public Shape
{
protected:
int *x;
int *y;
int area;
int vertices;
public:
double computeArea();
void setSquare(string, string, int*, int*);
string toString();
};
Square.cpp
void Square::setSquare(string name, string type, int* a, int* b)
{
setName(name);
setContainsWarpSpace (type);
vertices = 4;
x = new int[vertices];
y = new int[vertices];
for (int i = 0; i < vertices; i++)
{
x[i] = a[i];
y[i] = b[i];
}
}
string Square::toString()
{
ostringstream convert;
string s;
string type;
for (int i = 0; i < vertices; i++)
{
convert << "point " << i + 1
<< " ( "
<< x[i] << " , " << y[i]
<< " ) "<< endl;
}
s = convert.str();
return s;
}
Класс драйвера с int main()
class Driver
{
public:
Driver();
Shape *d[];
Square *s;
int count;
int noSquare;
int noRectangle;
int noCross;
void printDetails();
void printPlan();
void option1();
void option2();
void option3();
void option4();
string convertString(string);
};
Driver.cpp. Это конструктор по умолчанию,
Driver :: Driver()
{
Shape d [MAX];
s = new Square [MAX];
count = 0;
int noSquare = 0;
int noRectangle = 0;
int noCross = 0;
}
Driver::option1()
{
if (shape.compare("square") == 0)
{
tempx = new int[4];
tempy = new int[4];
for (int i = 0; i < 4; i++)
{
int j = i + 1;
cout << "Please enter x-ordinate of pt " << j << ": ";
cin >>tempx[i];
cout << "Please enter y-ordinate of pt " << j << ": ";
cin >>tempy[i];
}
s[noSquare].setSquare(shape,type, tempx,tempy);
d[count] = &s[noSquare];
d[count].toString();
}
}
int main ()
{
option1();
}
Измените способ объявления своей фигуры в классе драйвера. В заголовке объявите его как:
Shape* d;
и в вашем CPP его инициализировать:
d = new Shape[MAX];
Кроме того, поскольку вы выполняете наследование, массивы и указатели, вы должны управлять своими собственными деструкторами. Потому что если объект chil будет уничтожен, он получит родительский деструктор. Поэтому ваши деструкторы должны быть:
virtual ~Shape();
И квадрат:
virtual ~Square();
В них удалите указатели:
delete x; // in case of square
delete y;
И когда у вас есть массивы:
delete [] d; // in case of driver class
В противном случае он не освободит память. Это, вероятно, устранит ваши проблемы.
std::vector<Shape*>
.