2016-04-25 43 views
0

我正在学习指针,以及如何将它们用于向对象发送数组(大小未指定)。最后,我试图学习如何使用运算符重载,而不是在C++中使用“向量”来添加和多重数组。传递给对象时获取数组的长度

予定义的命名向量类,如下所示,

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,如果我尝试以显示主阵列的长度

cout<<sizeof(vec1)/sizeof(*vec1)<<endl; 

的长度显示为4,但是如果我将同一阵列传递给对象,则显示为2.

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

+2

请在提问前使用搜索 – Drop

+0

这不是我的问题,我知道“sizeof”不能用于指针。我开始知道数组是作为指向对象的指针传递的。 –

+0

'数组作为指针传递'不是真的。这更复杂。阅读重复数据删除线程中的答案,而不是其头文件,这里都有解释。关于它的许多重复问题和答案还有很多。奖金:尝试搜索“数组指针衰减”。请享用。 – Drop

回答

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

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

将一个数组作为参数传递就像传递一个指针到它的第一个元素一样,你松散了关于它的大小的每个信息。

+0

所以你说数组是作为指针传递给对象的。我读到'sizeof'不适用于指针。 –

+0

sizeof()返回用作参数的变量类型的大小(以字节为单位)。 – Stephen

+0

@Kalyan嗯,'sizeof()'可以很好地处理指针,但是会得到指针变量的大小,而不是_underlying array_。 –