在 C++ 中使用指针和指向指针参数的指针创建构造函数

Posted

技术标签:

【中文标题】在 C++ 中使用指针和指向指针参数的指针创建构造函数【英文标题】:Creating constructor with pointer and pointer to pointer parameters in C++ 【发布时间】:2015-05-24 22:01:33 【问题描述】:

我想初始化一个File 对象,它接受一个指针和指向指针的指针作为参数。这是正确的实现方式吗?

//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()函数?

【问题讨论】:

我建议this动态内存教程。 这不会编译,因为two[k]string* 类型,而s1[k]char。试着解释为什么你需要这个论点,也许有更好的解决方案(例如vector)。但是,如果您想删除它,您需要在每个 string* 上调用 delete,然后在 string** 上调用。 @NikolayKondratyev 你是对的。应该是s2[] 【参考方案1】:

如果你的意思是 s1 和 s2 是“新”指针,你只需要写: one = s1 and 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;

【讨论】:

@ NikolayKondratyev "s1[k] is char" : (*s1)[k] 是 char 但 s1[k] 是数组中的字符串。 感谢您的帮助。在第一种情况下我应该如何实现 clean() 函数?写“删除[]two”就够了吗? 是的,这就够了:删除[]一个;你可以使用 delete[] 两个;因为此时,它包含已删除的指针。

以上是关于在 C++ 中使用指针和指向指针参数的指针创建构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ Visual Studio 非标准语法使用 '&' 创建指向成员的指针

c++ 指针参数:创建指向值的副本是不是有意义,然后再次将副本存储为指针?

如何在构造函数中访问类变量以在不使用 C++ 中的 this 指针的情况下分配它们

c++怎样将指向【成员函数】的指针强转成指向【普通函数】的指针

是否可以定义指向构造函数的函数指针?

C++基础之类和对象二