【问题标题】:Creating constructor with pointer and pointer to pointer parameters in C++在 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[]

标签: c++ arrays pointers constructor


【解决方案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[] 两个;因为此时,它包含已删除的指针。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2013-03-07
  • 1970-01-01
  • 2023-03-12
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多