2016-09-14 76 views
1

您好我試圖爲類創建一個模板來打印出數組中的值。在模板中使用模板打印值class-C++

#include<iostream> 
using namespace std; 

template <typename T> 
class Array{ 
    public: 
     Array(T array[], int arraysize){ 
     size=arraysize; 
     _array=new T[size]; 
     } 

     ~Array(){ 
     delete[] _array; 
     } 
     void print(){ 
     for(int i=0; i<size; i++){ 
      cout<<_array[i]<<' '; 
     } 
     } 
     private: 
     T *_array; 
     int size; 
}; 

int main(){ 
    int array1[5]={1,2,3,4,5}; 
    Array<int> a(array1,5); 
    a.print(); 

    float array2[5]={1.012, 2.324, 3.141, 4.221, 5.327}; 
    Array<float> b(array2,5); 
    b.print(); 

    string array3[]={"Ch1","Ch2","Ch3","Ch4","Ch5"}; 
    Array<string> c(array3,5); 
    c.print(); 

    return 0; 

} 

這是代碼,我想知道什麼是錯的,因爲它會打印出隨機數。

回答

2

該代碼使用new創建模板的類成員_array,但不會將其初始化爲任何內容,這就是爲什麼您會打印出隨機垃圾。

構造函數確實收到參數array,並且使用該參數傳遞了一個初始化數組。然而,構造函數完全忽略了這個參數,並且沒有做任何事情。

顯然,您的意圖是將模板構造函數接收的數組內容作爲參數複製到_array中。但是那個代碼不見了。

array參數的內容不會自己複製到_array。你必須編寫代碼來做到這一點。

2

你的構造:

Array(T array[], int arraysize){ 
    size=arraysize; 
    _array=new T[size]; 
} 

所有你所做的就是指定數組的大小,而無需實際複製的內容分配內存。所以,你可以看到POD類型的一些隨機值,以及類類型的默認值。

你應該做的複製與std::copy

Array(T array[], int arraysize) 
    : _array(new T[arraysize]), size(arraysize) 
{ 
    std::copy(array, array+arraysize, _array); 
} 

正如你所看到的,我用member initailizer list;請記住Rule of 5。另外,我建議您改用std::unique_ptr