class 构造函数中的向量时出现运行时错误?

Runtime error when vector in class constructor?

您好,我无法在构造函数中使用向量。我正在尝试将包含 [x,y] 坐标的向量解析为 object.

我遇到的错误是运行时错误和分配错误。

有什么我遗漏的吗?

我必须使用动态内存分配吗?

ShapeTwoD(Child Class 的Parent Class 方形):

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;
  }

Class ShapeTwoD 的 child 正方形:

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;
}

在您的 Square 构造函数中,您没有传递任何参数:

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

这意味着 name, containsWarpSpacevect 引用父 class 字段,尚未初始化(因为这是 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, {}) {

问题是:

merge = x + ", " + y;

", " 是一个 const char[3](空字符数组)。作为一个数组,它衰减为一个指针 (const char *),作为与 int 求和的结果,它被 x+y 偏移。结果指针指向未知的内存位置。不能保证下一个空字节位于可访问的地址范围内;即使这样的字节在可访问的地址中,输出也没有意义;因为你正在触发 UB。 您可以这样修复它:

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

此致, 调频