2015-05-24 109 views
0

我想初始化一個File對象,該對象將指針和指針指針作爲參數。這是實施它的正確方法嗎?使用指針和指針指向C++中的指針參數創建構造函數

//file.h 
class File { 
    public: File(string * , int, string * * , int); 
    void clean(); 

    private: string * one; 
    int size_one; //gives size of one array 
    string * * two; 
    int size_two; //gives size of *two array 
} 

//file.cpp 
File::File(string * s1, int i1, string * * s2, int i2) { 
    int k; 
    one = new string[i1]; 
    for (k = 0; k < i1; k++) { 
     one[k] = s1[k]; 
    } 

    two = new string * [i2]; 
    for (k = 0; k < i2; k++) { 
     two[k] = s2[k]; 
    } 
} 

我應該如何實現clean()功能,同時刪除陣列?

+0

我建議[this](http://www.cplusplus.com/doc/tutorial/dynamic/)動態內存教程。 –

+1

由於'two [k]'是'string *'類型,'s1 [k]'是'char',所以不會編譯。嘗試擴大爲什麼你需要這個論點,也許有更好的解決方案(例如'vector')。但是,如果你想刪除它,你需要在每個'string *'上調用'delete',然後在'string **'上調用。 – NikolayKondratyev

+0

@NikolayKondratyev你是對的。它應該's2 []' – Doruk

回答

0

如果您的意思是s1和s2是「新」指針,您只需要編寫: one = s1和two = s2,因爲字符串數據已被分配並封裝在s1和s2指針包含的地址後面。

如果你想克隆s1和s2內容,你的實現是正確的。 有了兩個,你需要指定s2是否是你想要克隆的指針的指針。因此,解決方案可能是:

two = new string*[i2]; 
for (int k(0) ; k < i2 ; ++k) 
    two[k] = s1[k]; 

two = new string*[i2]; 
for (int k(0) ; k < i2 ; ++k) 
{ 
    two[k] = new string[yourDim]; 
    for (int l(0) ; l < i2 ; ++l) 
     two[k][l] = s2[k][l]; 
} 

,如果你想清理第二種情況下,你需要的陣列之前清理數組的數組。

for (int k(0) ; k < i2 ; ++k) 
    delete two[k]; 
delete two; 
+0

@ NikolayKondratyev「s1 [k]是char」:(* s1)[k]是char,但s1 [k]是數組中的字符串。 – Cevik

+0

感謝您的幫助。我應該如何在第一種情況下實現clean()函數?寫「刪除[]兩個」就足夠了嗎? – Doruk

+0

是的,就足夠了:刪除[]一個;你可以使用delete []兩個;因爲此時它包含已刪除的指針。 – Cevik