2016-04-25 40 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_。 –