我正在学习指针,以及它们如何用于向对象发送数组(未分配大小)。最后我试图学习如何使用运算符重载而不是在c ++中使用“vector”来添加和乘法数组。
我定义了一个名为vector的类,如下所示,
class vector
{
private:
int len;
int *pvec;
}
public:
vector(int array[])
{
len = sizeof(array)/sizeof(*array);
cout<<len<<endl;
pvec = new int[len+1];
for(int i = 0;i<len;i++)
{
pvec[i] = *(array + i);
}
}
void display()
{
cout<<"[";
for(int i = 0;i<len;i++)
{
cout<<pvec[i];
if(i < len-1)
{
cout<<",";
}
}
cout<<endl;
}
};
并且我声明了类向量的对象,如下所示
int vec1[] = {1,2,3,4};
vector v(vec1);
当我尝试使用成员函数
显示向量中的元素时v.display();
输出如下
2
[1,2]
但是你可以看到向量的长度是4,但是在输出中它显示为2.如果我尝试在main中显示数组的长度
cout<<sizeof(vec1)/sizeof(*vec1)<<endl;
长度显示为4,但如果我将相同的数组传递给对象,则显示为2.
如果有人能指出这个程序中的错误,我将不胜感激。
答案 0 :(得分:2)
一旦将数组作为指针传递给函数,就无法计算数组的大小。
但是,您可以使用构造函数的几个重载来帮助您获得所需的内容。
在第一个中,期望一个指向数组和大小的指针。
vector(int array[], int size) : len(size)
{
cout<<len<<endl;
pvec = new int[len+1];
for(int i = 0;i<len;i++)
{
pvec[i] = *(array + i);
}
}
在第二个中,使用具有数组大小的模板作为 模板参数。使它成为调用第一个的委托构造函数 一个人来做这项工作。
template <int N> vector(int (&array)[N]) : vector(array, N) {}
有了这个你可以使用:
// Use the first constructor
int* array1 = new int[20];
vector v1(array1, 20);
// Use the second constructor
int array2[10] = {0};
vector v2(array2);
在http://ideone.com/RJN1gd处查看它。
答案 1 :(得分:1)
没有办法,你应该将长度作为附加功能的参数传递。
将数组作为参数传递几乎就像将指针传递给它的第一个元素一样,你会丢失有关其大小的所有信息。