在 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 指针的情况下分配它们