我正在尝试实现一个由int(度)和整数数组(每个项的系数)组成的多项式类。我有一个打印多项式的函数,当我直接传递次数和项数组时,它可以很好地工作,但是当我尝试将这些值放入我的多项式类的实例中时,事情变得很时髦。
我在多项式的构造函数中使用了可变参数,因此您应该能够调用多项式(degree,)。我确保在va_list中输出每个词,这样我就知道我的目标是我想要的。
这是我的课程:
class polynomial{
public:
polynomial(int degree...){
va_list args;
_degree = degree;
int p[degree];
va_start(args,degree);
for(int i = 0; i < degree; i++){
p[i] = va_arg(args,int);
cout << p[i] << endl; //just to verify that I'm grabbing the right values.
}
va_end(args);
_terms = p;
}
int degree(){return _degree;}
int* terms(){return _terms;}
private:
int _degree;
int* _terms;
};
这是我用来打印多项式的函数:
void printArray(int*p, int l){
std::cout << "[";
for(int i = 0; i < l; i++){
std::cout << p[i];
if(i != l-1) std::cout << ",";
}
std::cout << "]" << std::endl;
}
void printArray(polynomial p){
printArray(p.terms(), p.degree());
}
我的主要功能:
int main()
{
int a[3] = {2,5,3};
printArray(a,3);
polynomial p1(3,2,5,3);
printArray(p1.terms(), p1.degree());
printArray(p1);
return 0;
}
和输出:
[2,5,3]
2
5
3
[2,0,94004573]
[1,0,1]
如您所见,我调用了printArray()3次。第一次,我直接创建一个整数数组并将其及其长度传递给printArray()。这次,它工作正常,按预期输出[2,5,3]。第二次,我再次使用printArray()的第一个实现,但是这次我传入了int *和多项式实例的int。这次,我得到了一个数组,该数组的前两个元素始终总是为0和2,并且最后一个值为垃圾值。 第三次,我只是将多项式传递给printArray()的第二个实现。这似乎始终输出[1,0,1](这当然是错误的)。
我想,如果第二个和第三个对printArray()的调用产生相同的垃圾值,那不会太令人困惑,但是就目前而言,就幕后发生的事情而言,我相当失落。任何帮助将不胜感激。谢谢!
答案 0 :(得分:2)
问题是这两行:
int p[degree];
和
_terms = p;
第一个(不是编译器的不可移植variable-length array扩展名)将p
定义为 local 变量。 / p>
第二行使_terms
指向此数组的第一个元素。
然后,构造函数结束,p
的生命周期也随之结束,在_terms
中留下无效的指针。
自然的解决方案是改用std::vector
。而且,如果您需要使用指针(由于分配/运动要求),则需要使用动态分配(使用new[]
,然后还需要了解the rule of three/five)。