Ошибка выполнения при использовании вектора в конструкторе класса? - PullRequest
1 голос
/ 06 августа 2020

Привет, я не могу использовать вектор в конструкторе. Я пытаюсь проанализировать вектор, содержащий координаты [x, y], в объект.

Полученные мной ошибки - это ошибка времени выполнения и неправильный алло c.

Есть ли что-то, чего мне не хватает?

Нужно ли мне использовать динамическое c выделение памяти?

ShapeTwoD (родительский класс дочернего класса Square):

class ShapeTwoD {

protected:
  string name;
  bool containsWarpSpace;
  vector<string> vect;

private:
public:
  ShapeTwoD() {}

  ShapeTwoD(string name, bool containsWarpSpace, vector<string> vect) {
    this->vect = vect;
    this->name = name;
    this->containsWarpSpace = containsWarpSpace;
  }

Класс Square, который является дочерним для ShapeTwoD:

class Square : public ShapeTwoD {

public:
  Square() : ShapeTwoD(name, containsWarpSpace, vect) {
    this->vect = vect;
    this->name = name;
    this->containsWarpSpace = containsWarpSpace;
  }

  ~Square() {}
};

Основная функция:

  vector<string> temp;

  string merge;

  for (int i = 0; i < 4; i++) {
    cout << "Please enter x-ordinate of pt " << i + 1 << " :";
    cin >> x;
    cout << "Please enter y-ordinate of pt " << i + 1 << " :";
    cin >> y;

    merge = x + ", " + y;

    temp.push_back(merge);
  }
  Square obj;

  obj.setName(shape);
  obj.setCoord(temp);

  if (specialtype == "ws") {
    obj.setContainsWarpSpace(true);
  }

  else if (specialtype == "ns") {
    obj.setContainsWarpSpace(false);
  }

  myvector.push_back(obj);
  temp.clear();

  cout << "\nRecords successfully stored. Going back to main menu ...\n"
       << endl;
}

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 06 августа 2020

В конструкторе Square вы не передаете никаких аргументов:

Square() : ShapeTwoD(name,containsWarpSpace,vect){
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Это означает, что name , containsWarpSpace и vect относятся к полям родительского класса, которые еще не инициализированы (потому что это работа конструктора ShapeTwoD). Итак, вы берете неинициализированные переменные и передаете их в конструктор для инициализации тех же переменных. Более подробно, что вы делаете, это

Square():ShapeTwoD(this->ShapeTwoD::name, 
    this->ShapeTwoD::containsWarpSpace, this->ShapeTwoD::vect){

Вы должны либо передать их:

Square(string name, bool containsWarpSpace, vector<string> vect)
    :ShapeTwoD(name,containsWarpSpace,vect) {

, либо передать разумное значение по умолчанию:

Square() : ShapeTwoD("", false, {}) {
0 голосов
/ 06 августа 2020

Проблема:

merge = x + ", " + y;

", " - это const char[3] (массив символов с завершающим нулем). Как массив, он распадается на указатель (const char *), который смещается на x+y в результате суммирования с int. Результирующий указатель ссылается на неизвестную ячейку памяти. Не гарантируется, что следующий нулевой байт находится в доступном диапазоне адресов; даже если такой байт находится в доступном адресе, вывод не будет иметь смысла; потому что вы запускаете UB. Исправить можно так:

merge = std::to_string(x) + ", " + std::to_string(y);

С уважением, FM.

...