gpt4 book ai didi

c++ - 为什么我的 vector 大小一直重置为 0? (目前正在使用类(class))

转载 作者:太空宇宙 更新时间:2023-11-04 13:23:20 26 4
gpt4 key购买 nike

我一直在尝试制作一个多项式类,我已经完成了将近一半。但是,我的 vector 在“多项式 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;
}

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

最佳答案

这一行:

polynomial();

创建一个未命名的对象并立即销毁它。它具有与以下相同的效果:

{
polynomial x;
}

我猜你是想“调用构造函数”。然而,这是不可能的,构造函数是特殊的,只能通过尝试创建对象来“调用”;或来自 ctor-initializer 列表。


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

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

我建议对带有两个参数的构造函数执行此操作:

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 的私有(private)函数中。这使您的构造函数易于阅读并使您的代码整洁;您可能希望稍后使用此函数以允许用户更改多项式。

专业提示:查看 std::tie,您实际上可以使用单个命令对 coefficientdegree 进行排序。

关于c++ - 为什么我的 vector 大小一直重置为 0? (目前正在使用类(class)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34194376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com