C++ 将带有数组成员的类传递到使用该数组成员的函数的重载中
我试图实现一个多项式类,它由一个int(度数)和一个整数数组(每个项的系数)组成。我有一个函数来打印多项式,当我直接传入度和项数组时,它工作得很好,但是当我尝试将这些值放入多项式类的实例时,事情变得很糟糕 我在多项式的构造函数中使用可变参数,这样您就可以调用多项式(度)。我确保在我的va_列表中输出每个术语,所以我知道我的目标是我想要的 这是我的班级:C++ 将带有数组成员的类传递到使用该数组成员的函数的重载中,c++,pointers,variadic-functions,C++,Pointers,Variadic Functions,我试图实现一个多项式类,它由一个int(度数)和一个整数数组(每个项的系数)组成。我有一个函数来打印多项式,当我直接传入度和项数组时,它工作得很好,但是当我尝试将这些值放入多项式类的实例时,事情变得很糟糕 我在多项式的构造函数中使用可变参数,这样您就可以调用多项式(度)。我确保在我的va_列表中输出每个术语,所以我知道我的目标是我想要的 这是我的班级: class polynomial{ public: polynomial(int degree...){
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;
};
以及输出:
[2,5,3]
2
5
3
[2,0,94004573]
[1,0,1]
如您所见,我调用printary()3次。第一次,我直接创建一个整数数组,并将其及其长度传递到printArray()。这一次,它工作正常,输出了预期的[2,5,3]。第二次,我再次使用printary()的第一个实现,但这次我从多项式的一个实例传入int*和int。这一次,我得到了一个数组,它的前两个元素似乎总是0和2,最后一个值是一些垃圾值。
第三次,我只是将多项式传递给printary()的第二个实现。这似乎一致地输出[1,0,1](这当然是不正确的)
如果对printary()的第二次和第三次调用生成了相同的垃圾值,我想这不会太令人困惑,但就目前情况而言,我对幕后发生的事情相当迷茫。任何帮助都将不胜感激。谢谢大家! 问题在于这两条线:
int p[degree];
及
第一个变量(除了不是编译器的不可移植扩展外)定义为p
局部变量
第二行使\u terms
指向该数组的第一个元素
然后构造函数结束,p
的生命周期也随之结束,在\u terms
中留下一个无效指针
自然的解决办法是使用替代品。如果你需要使用指针(因为赋值/练习要求),你需要使用动态分配(使用<代码> NeX[]/CODE >,并且你还需要学习)。< /P>不要使用C++代码的原始数组或指针。使用
std::array
、std::vector
或智能指针。int p[degree]代码>这是无效的C++。C++中的动态数组是通过使用<代码> STD::向量< /代码>,如@π-π→To-α中的注释所指定的。ῥεῖ我试图理解结果,而不是试图解决问题。我知道我可以只使用向量,但我更想知道为什么这个解决方案有效,而我的解决方案无效。@Blueper为了了解它有效或无效的原因,可能需要编译代码并运行它。因此语法确实很重要。@Blueper好吧,让我们从intp[degree]开始代码>不是有效的C++标准代码。啊,漂亮的解释。非常感谢你!这很有道理。这些要求源于我自己的固执,而不是任何作业^^“我只是想更好地掌握编译器的工作原理。再次感谢!
[2,5,3]
2
5
3
[2,0,94004573]
[1,0,1]
int p[degree];
_terms = p;