Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将带有数组成员的类传递到使用该数组成员的函数的重载中_C++_Pointers_Variadic Functions - Fatal编程技术网

C++ 将带有数组成员的类传递到使用该数组成员的函数的重载中

C++ 将带有数组成员的类传递到使用该数组成员的函数的重载中,c++,pointers,variadic-functions,C++,Pointers,Variadic Functions,我试图实现一个多项式类,它由一个int(度数)和一个整数数组(每个项的系数)组成。我有一个函数来打印多项式,当我直接传入度和项数组时,它工作得很好,但是当我尝试将这些值放入多项式类的实例时,事情变得很糟糕 我在多项式的构造函数中使用可变参数,这样您就可以调用多项式(度)。我确保在我的va_列表中输出每个术语,所以我知道我的目标是我想要的 这是我的班级: class polynomial{ public: polynomial(int degree...){

我试图实现一个多项式类,它由一个int(度数)和一个整数数组(每个项的系数)组成。我有一个函数来打印多项式,当我直接传入度和项数组时,它工作得很好,但是当我尝试将这些值放入多项式类的实例时,事情变得很糟糕

我在多项式的构造函数中使用可变参数,这样您就可以调用多项式(度)。我确保在我的va_列表中输出每个术语,所以我知道我的目标是我想要的

这是我的班级:

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;