Наследование с ошибкой сегментации

0

Сейчас я работаю над наследованием. У меня есть базовый класс 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();


}
Теги:

1 ответ

0

Измените способ объявления своей фигуры в классе драйвера. В заголовке объявите его как:

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

В противном случае он не освободит память. Это, вероятно, устранит ваши проблемы.

  • 1
    Конструкторы копирования также должны быть реализованы в явном виде, иначе копирование в виде фигуры приведет к двойному удалению, когда второй объект удаляет те же удержанные указатели, что и первый.
  • 2
    Он хочет (и нуждается) в массиве указателей, а не в указателе на массив. Наиболее логичным решением будет std::vector<Shape*> .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню