C++ 为什么我的向量大小一直重置为0?(目前正在使用类)

C++ 为什么我的向量大小一直重置为0?(目前正在使用类),c++,vector,C++,Vector,我一直在尝试制作一个多项式类,我几乎完成了一半。然而,在“多项式q(coeff,expo);”之后,我的向量一直重置为0,有人能告诉我为什么吗 class polynomial { public: polynomial(); polynomial(vector<float> coefficient, vector<int> degree); friend ostream& operator<<(ostream& o

我一直在尝试制作一个多项式类,我几乎完成了一半。然而,在“多项式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;
}
类多项式{
公众:
多项式();
多项式(向量系数、向量度);
friend ostream&operator此行:

polynomial();
创建一个未命名的对象并立即将其销毁。其效果与:

{
    polynomial x;
}
我猜您试图“调用构造函数”。但是这是不可能的,构造函数是特殊的,只能通过尝试创建对象或从ctor初始值设定项列表来“调用”


我建议重新设计您的构造函数。首先,复制构造函数是伪造的(除了
ptr
,它不复制任何字段,而且
int*ptr
不是由普通构造函数初始化的)。事实上
int*ptr;
应该完全删除

在构造函数
polymonent()
中,对
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);
    }
}
多项式::多项式(向量系数、向量度)
{
如果(系数.size()!=度.size())
{
//通常情况下,最好在这里抛出一个异常,调用方不会期望1-多项式
标准::cerr这一行:

polynomial();
创建一个未命名的对象并立即将其销毁。其效果与:

{
    polynomial x;
}
我猜您试图“调用构造函数”。但是这是不可能的,构造函数是特殊的,只能通过尝试创建对象或从ctor初始值设定项列表来“调用”


我建议重新设计您的构造函数。首先,复制构造函数是伪造的(除了
ptr
,它不复制任何字段,而且
int*ptr
不是由普通构造函数初始化的)。事实上
int*ptr;
应该完全删除

在构造函数
polymonent()
中,对
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);
    }
}
多项式::多项式(向量系数、向量度)
{
如果(系数.size()!=度.size())
{
//通常情况下,最好在这里抛出一个异常,调用方不会期望1-多项式

为什么
新的int
?而你的复制构造函数是完全错误的,这可能就是你遇到问题的原因。因为你没有复制向量,所以你在进行部分/伪复制。如果你去掉了
新的int
东西,你就不需要复制构造函数。是的,我知道,正如我所说的,有些部分仍然很有用s、 而且,即使我删除了复制构造函数,向量仍然变为0。:/我只是想问为什么大小一直变为0。不要介意其他部分,因为我非常确定它们不会影响我正在使用的向量。@tupsman提问时,请将问题减少到可以演示的最小代码量您遇到的一个特定问题。请参阅“帮助”部分中关于a的说明。(这意味着在本例中,对于初学者来说,没有不使用的运算符的定义)请注意编辑按钮。
polyman();
这会创建一个临时对象,然后立即丢弃它。这很奇怪,因为在“q(coeff,expo)”期间大小确实变为1和0,但一旦我找到ostream操作符,它就变成了0和0。真的很奇怪,对吗?呃。我开始认为它可能与构造函数有关?因为据我所知,构造函数应该在类使用后自动执行。为什么
new int
?而你的复制构造函数是完全错误的,w这可能就是你遇到问题的原因。因为你没有复制向量,所以你在进行部分/伪造的复制。如果你去掉了
新的int
东西,你就不需要复制构造函数了。是的,我知道,正如我说的,有些部分仍然很无用。而且,即使我删除了复制构造函数,向量仍然变为0。:/I'm really只是问为什么大小一直变为0。不要介意其他部分,因为我很确定它们不会影响我正在使用的向量。@tupsman提问时,请将问题减少到可以演示特定问题的最小代码量。请参阅“帮助”部分中关于向量的说明。(对于初学者来说,这意味着在这种情况下没有不使用的运算符的定义)请注意编辑按钮。
polymone();
这会创建一个临时对象,然后立即丢弃它。这很奇怪,因为在“q(coeff,expo)”期间大小确实变为1和0,但一旦我到达ostream操作符,它就变成了0和0。真的很奇怪,对吗?呃。我开始认为它可能与构造函数有关?因为据我所知,一旦类被使用,构造函数应该自动执行。好吧,我想我应该把构造函数的内容放在那里n不要调用“多项式()谢谢!编辑:成功了!哈哈哈,我喜欢这个网站上的人site@tupsman是的,因为它很简单,所以这是一个很好的解决方案。如果代码更复杂,那么一种方法是将代码放在另一个函数中,你可以从两个构造函数调用该函数。实际上,我会在几分钟内更新我刚刚发布的建议好吧,我想我应该把构造器的内容放在那里,而不是调用“多项式()”。Tha