2015-05-24 187 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