Программа, не запущенная в некоторых IDE, проблема с классами

#c #oop

#c #ооп

Вопрос:

Кто-нибудь может помочь мне найти проблему в моем коде здесь? Я продолжаю получать сообщение об ошибке, в котором просто говорится, что программа завершена. Она запускается на определенных ide, но не на других, и это причиняет боль, потому что я чувствовал, что начинаю понимать концепции ООП, но, думаю, нет. Основная идея программы заключается в считывании данных формы в массив указателей, а затем отображении всей информации о формах.

 #include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

// Global constant for array size.
const int SIZE = 99;

// Base Class
class Shape
{
protected:
  char type;
  int serNo;
  int dim1;
  int dim2;

public:
  // Default constructor
  Shape()
  {
    type = ' ';
    serNo = 0;
    dim1 = 0;
    dim2 = 0;
  }

  // Constructor #1
  Shape(char t, int s, int d1, int d2)
  {
    type = t;
    serNo = s;
    dim1 = d1;
    dim2 = d2;
  }

  // Get type
  char getType()
  {
    return type;
  }

  // Get serial number
  int getSerNo()
  {
    return serNo;
  }

  // Get dimension1
  int getDim1()
  {
    return dim1;
  }    

  // Get dimension2
  int getDim2()
  {
    return dim2;
  }

  // Destructor
  ~Shape()
  {}
};

// Circle Class (Derived from Shape)
class Circle : public Shape
{
public:
  Circle(char t, int s, int d1, int d2) : Shape(t, s, d1, d2)
  {}

};

// Spray Class (Derived from Circle)
class Spray : public Circle
{
public:
// Constructor
  Spray(char t, int s, int d1, int d2) : Circle(t, s, d1, d2)
  {}

};

// Rectangle Class (Derived from Shape)
class Rectangle : public Shape
{
public:
// Constructor
  Rectangle(char t, int s, int d1, int d2) : Shape(t, s, d1, d2)
  {}

};

// Square Class (Derived from Rectangle)
class Square : public Rectangle
{
public:
// Constructor
  Square(char t, int s, int d1, int d2) : Rectangle(t, s, d1, d2)
  {}

};

class mgrShape : public Shape
{
protected:
  int recordCount;
  Shape * shapeArr[SIZE] = {nullptr}; // Manager owns the main data 
//structure
public:
  // Constructor.
  mgrShape()
  {
    populateShapeData();
  }

  // Populate the shapeArr from file.
  void populateShapeData()
  {
    fstream inputFile;
    string fileName = "shaperecords.txt";
    inputFile.open(fileName);
    while(inputFile >> type >> serNo >> dim1 >> dim2)
    {
      if (type == 'C')
        shapeArr[recordCount] = new Circle(type, serNo, dim1, dim2);
      else if (type == 'R')
        shapeArr[recordCount] = new Rectangle(type, serNo, dim1, dim2);
      else if (type == 'S')
        shapeArr[recordCount] = new Spray(type, serNo, dim1, dim2);
      else if (type == 'Q')
        shapeArr[recordCount] = new Square(type, serNo, dim1, dim2);
      recordCount  ;
    }
    inputFile.close();
  }

  //Display all of the shapes.
  void displayAll()
  {
    for (int i = 0; i < recordCount; i  )
    {
      if (shapeArr[i]->getType() == 'C')
      {
        cout << "Circle Found!" << endl;
        cout << shapeArr[i]->getType() << endl;
        cout << shapeArr[i]->getSerNo() << endl;
        cout << shapeArr[i]->getDim1() << endl;
        cout << shapeArr[i]->getDim2() << endl;
      }
      else if (shapeArr[i]->getType() == 'R')
      {
        cout << "Rectangle Found!" << endl;
        cout << shapeArr[i]->getType() << endl;
        cout << shapeArr[i]->getSerNo() << endl;
        cout << shapeArr[i]->getDim1() << endl;
        cout << shapeArr[i]->getDim2() << endl;
      }
      else if (shapeArr[i]->getType() == 'S')
      {
        cout << "nSpray Found!" << endl;
        cout << shapeArr[i]->getType() << endl;
        cout << shapeArr[i]->getSerNo() << endl;
        cout << shapeArr[i]->getDim1() << endl;
        cout << shapeArr[i]->getDim2() << endl;
      }
      else if (shapeArr[i]->getType() == 'Q')
      {
        cout << "Square Found!" << endl;
        cout << shapeArr[i]->getType() << endl;
        cout << shapeArr[i]->getSerNo() << endl;
        cout << shapeArr[i]->getDim1() << endl;
        cout << shapeArr[i]->getDim2() << endl;
      }
    }
  }

// Clear the dynamically allocated memory from shapeArr.
~mgrShape()
{
  for (int i = 0; i < recordCount; i  )
    delete shapeArr[i];
}

};


int main()
{
  mgrShape ms;

  ms.displayAll();

  return 0;
}





//And here's the input file's contents

//C 1001 30 -1
//R 1002 14 10
//S 1003 30 20
//Q 1004 28 -1
//S 1005 30 75
  

Комментарии:

1. Пожалуйста, вырежьте и вставьте фактические ошибки и используйте отладчик в IDE, чтобы сузить проблему. Кроме того, вы включили предупреждения и исправили проблемы, выявленные компилятором? Особенно любое предупреждение об recordCount использовании перед инициализацией.

2. Проведите еще немного исследований по ООП. Должна mgrShape быть производной от Shape ? Наследование — это отношение «есть-a». Является mgrShape a Shape ?

3. Продолжение комментария @MikeBorkland: Ознакомьтесь с принципом подстановки Лискова . Версия TL; DR звучит примерно так: «Должно быть, имеет смысл использовать производный класс в качестве экземпляра базового класса». В этом случае не имеет смысла использовать Shape менеджер, как если бы это был другой Shape . Вероятно, вы хотите, чтобы связь была одной из composition, менеджер содержит Shape s. Другая возможность, которая здесь не представляется необходимой, — это friend отправка, менеджер может проверять / использовать Shape данные private .