传递给对象时获取数组的长度

时间:2016-04-25 16:31:38

标签: c++ arrays oop object vector

我正在学习指针,以及它们如何用于向对象发送数组(未分配大小)。最后我试图学习如何使用运算符重载而不是在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.

如果有人能指出这个程序中的错误,我将不胜感激。

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)

没有办法,你应该将长度作为附加功能的参数传递。

将数组作为参数传递几乎就像将指针传递给它的第一个元素一样,你会丢失有关其大小的所有信息。