为什么我的矢量大小一直重置为0?(当前使用类)

Why does my vector size keep resetting to 0? (currently using classes)

本文关键字:我的 一直 为什么      更新时间:2023-10-16

我一直在尝试创建一个多项式类,我已经完成了几乎一半。然而,在"多项式q(coeff,expo);"之后,我的向量一直重置为0,有人能告诉我为什么吗?

class polynomial {
  public:
    polynomial();
    polynomial(vector<float> coefficient, vector<int> degree);
    friend ostream& operator<<(ostream& os, const polynomial& y);
  private:
    vector<float> coeff1;
    vector<int> expo1;
};
polynomial::polynomial(){
  coeff1.clear();
  expo1.clear();
  coeff1.push_back(1);
}
polynomial::polynomial(vector<float> coefficient, vector<int> degree){
  if (coefficient.size() != degree.size()){
    cout << "Error. The number of coefficients are not the same as the number of exponents. Polynomial will be set to 1." << endl;
    polynomial();
  }
  else {
    for (int b = 0; b<degree.size(); b++) {
      for (int c = 0; c<b; c++){
        if (degree[b] > degree[c]){
          int holder = degree[b];
          degree[b] = degree[c];
          degree[c] = holder;
          float holder1 = coefficient[b];
          coefficient[b] = coefficient[c];
          coefficient[c] = holder1;
        }
      }
    }

    for (int a = 0; a<coefficient.size(); a++) {
      coeff1.push_back (coefficient[a]);
      expo1.push_back (degree[a]);
    }
  }
}

ostream& operator<<(ostream& os, const polynomial& y){
  if (y.coeff1.size() != y.expo1.size()) {
    os << 1;
    return os;
  }
  else {
    for (int x = 0; x<y.coeff1.size(); x++){
      if (y.coeff1[x] != y.coeff1[y.coeff1.size() - 1]) {
        if (y.expo1[x] == 1){
          os << y.coeff1[x] << "x" << " + ";
        }
        else if(y.expo1[x] == 0) {
          os << y.coeff1[x];
        }
        else {
          os << y.coeff1[x] << "x^" << y.expo1[x] << " + ";
        }
      }
      else {
        if (y.expo1[x] == 1){
          os << y.coeff1[x] << "x";
        }
        else if(y.expo1[x] == 0) {
          os << y.coeff1[x];
        }
      }
    }
    return os;
  }
}
int main()
{
  vector<float> coeff;
  vector<int> expo;
  coeff.push_back(3);
  coeff.push_back(16);
  coeff.push_back(10);
  //    coeff.push_back(7);
  expo.push_back(4);
  expo.push_back(1);
  expo.push_back(2);
  expo.push_back(3);

  polynomial p;
  cout << "The polynomial is: " << p << endl;
  polynomial q(coeff, expo);
  cout << "The polynomial is: " << q << endl;
  return 0;
}

[有无用的代码行,因为我想检查矢量的大小在哪里变为0]

此行:

polynomial();

创建一个未命名的对象并立即将其销毁。其效果与:相同

{
    polynomial x;
}

我猜你是想"调用构造函数"。然而,这是不可能的,构造函数是特殊的,只能通过尝试创建对象来"调用";或从ctor初始值设定项列表。


我建议重新设计你的构造函数。首先,复制构造函数是伪造的(它不复制除ptr之外的任何字段,而且int *ptr也没有被普通构造函数初始化)。实际上int *ptr;应该被完全移除。

在构造函数polynomial()中,对clear()的调用是多余的。向量一开始是空的,因为这是一个构造函数,所以它只在第一次创建的多项式上调用。

我建议构造函数使用两个参数:

polynomial::polynomial(vector<float> coefficient, vector<int> degree)
{
    if (coefficient.size() != degree.size())
    {
    // typically it would be better to just throw an exception here, the caller will not expect a 1-polynomial 
        std::cerr << "Error. The number of coefficients are not the same as the number of exponents. Polynomial will be set to 1." << std::endl;
        coeff1.push_back(1);
        wala();
    }
    else 
    {
        set_polynomial(coefficient, degree);
    }
}

并将用于对系数和度数进行排序的另一个逻辑移动到一个名为set_polynomial的私有函数中。这使您的构造函数易于阅读,代码整洁;您可能希望稍后使用此函数,以允许用户更改多项式。

专业提示:查看std::tie,您实际上可以使用一个命令将coefficientdegree一起排序。