C++ 正在尝试编写字符串构造函数来处理静态字符*,例如“Hello World”

C++ 正在尝试编写字符串构造函数来处理静态字符*,例如“Hello World”,c++,C++,我有一门弦乐课。最近,我发现这个可怜的家伙无法处理: String string = "Hello World"; 我立即决定通过添加构造函数来纠正这个问题。但是,我不知道确切的参数: inline String(const char[] str) : Array(str, sizeof(str) / sizeof(char)) { } 生成以下错误:错误C2146:语法错误:标识符“str”之前缺少 我的想法是,因为它是一个静态字符*文本,所以它并不意味着要传递给函数。但是,我真的

我有一门弦乐课。最近,我发现这个可怜的家伙无法处理:

String string = "Hello World";  
我立即决定通过添加构造函数来纠正这个问题。但是,我不知道确切的参数:

inline String(const char[] str) : Array(str, sizeof(str) / sizeof(char)) { }  
生成以下错误:错误C2146:语法错误:标识符“str”之前缺少

我的想法是,因为它是一个静态字符*文本,所以它并不意味着要传递给函数。但是,我真的不知道


谢谢。为了保证安全-任何传递给数组的数组都将被立即复制,而不是存储

最简单的方法是将const char*作为参数。然后使用strlen查找字符串长度,然后使用new分配len+1个字符,并使用strncpy将字符串复制到新分配的内存中。顺便说一句,不使用std::string的任何具体原因?

最简单的方法是将const char*作为参数。然后使用strlen查找字符串长度,然后使用new分配len+1个字符,并使用strncpy将字符串复制到新分配的内存中。顺便说一下,不使用STD::String?< /P> < P>不需要使用siZeFCHAR——根据C++ SIEZOFCHAR标准总是等于1。< /P> < P>不需要使用siZeFCHAR——根据C++ SIEZOFCHAR标准总是等于1。< /P> < P>因为这个方括号[]应该去STR之后生成这个特殊的错误,不是在char之后。更改此选项,错误将消失


但是,我认为您的计算sizeofstr/sizeofchar不起作用,因为当数组用作参数时,您会丢失有关字符串长度的信息。它仅在使用原始数组时才起作用。您执行的计算将等效于sizeofchar*/sizeofchar,它不会反映字符串的大小。相反,按照Asha所说的去做,并使用strlen和strcpy。

之所以产生这个错误,是因为方括号[]应该放在str后面,而不是char后面。更改此选项,错误将消失


但是,我认为您的计算sizeofstr/sizeofchar不起作用,因为当数组用作参数时,您会丢失有关字符串长度的信息。它仅在使用原始数组时才起作用。您执行的计算将等效于sizeofchar*/sizeofchar,它不会反映字符串的大小。相反,按照Asha说的做,使用strlen和strcpy。

如果将签名更改为inline Stringchar const*const str,是否有效?或者只是内联Stringchar*str?如果将签名更改为内联Stringchar const*const str,是否有效?或者只是内嵌SrrcChar * STR?它可以用于学习目的,对于生产代码,重新发明车轮是没有意义的。这是一件好事,我正在努力学习C++,然后。谢谢为什么不用strdup呢?通过这种方式,您可以在初始值设定项列表中初始化ptr。@RedX:但是您需要使用'free',如果字符串类还有其他构造函数是新的,那么代码将非常混乱。@Asha啊!现在我明白你的意思了,是的,你绝对应该坚持新的或malloc,而不是两者兼而有之-对于学习目的来说,它是好的,对于生产代码来说,重新发明车轮是没有意义的。这是一件好事。我正在努力学习C++,然后。谢谢为什么不用strdup呢?通过这种方式,您可以在初始值设定项列表中初始化ptr。@RedX:但是您需要使用'free',如果字符串类还有其他构造函数是新的,那么代码将非常混乱。@Asha啊!现在我明白你的意思了,是的,你绝对应该坚持新的或malloc,而不是两者兼而有之-我算了算,当我检查一个断点时,计数等于4。不过,谢谢你我算了算,当我检查一个断点时,计数等于4。不过,谢谢你