将带有数组成员的类传递给使用该数组成员的函数重载

时间:2019-08-07 18:19:13

标签: c++ pointers variadic-functions

我正在尝试实现一个由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()的调用产生相同的垃圾值,那不会太令人困惑,但是就目前而言,就幕后发生的事情而言,我相当失落。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

问题是这两行:

int p[degree];

_terms = p;

第一个(不是编译器的不可移植variable-length array扩展名)将p定义为 local 变量。 / p>

第二行使_terms指向此数组的第一个元素。

然后,构造函数结束,p的生命周期也随之结束,在_terms中留下无效的指针。

自然的解决方案是改用std::vector。而且,如果您需要使用指针(由于分配/运动要求),则需要使用动态分配(使用new[],然后还需要了解the rule of three/five)。