Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ setter方法出错:参数类型为;常量字符*”;与类型为“的参数不兼容”;字符*”;_C++ - Fatal编程技术网

C++ setter方法出错:参数类型为;常量字符*”;与类型为“的参数不兼容”;字符*”;

C++ setter方法出错:参数类型为;常量字符*”;与类型为“的参数不兼容”;字符*”;,c++,C++,我试图在某个类中为name创建一个setter,但我遇到了一个问题 void Cats::setName(char*s){ 如果(此->名称!=NULL){ 删除[]名称; 名称=新字符[strlen(s+1)]; strcpy_s(s,strlen(名称)+1,名称); } } 那是setter,我不能为我的猫写任何名字 猫::猫(){ 集合名(“NoName”);“NoName”是一个常量字符*。常量意味着没有人可以修改其中的字符。您的函数采用一个字符*,这是一个可变字符数组。您不能将常量

我试图在某个类中为
name
创建一个setter,但我遇到了一个问题

void Cats::setName(char*s){
如果(此->名称!=NULL){
删除[]名称;
名称=新字符[strlen(s+1)];
strcpy_s(s,strlen(名称)+1,名称);
}
}
那是setter,我不能为我的猫写任何名字

猫::猫(){ 集合名(“NoName”);
“NoName”
是一个
常量字符*
常量
意味着没有人可以修改其中的字符。您的函数采用一个
字符*
,这是一个可变字符数组。您不能将常量数据传递给签名需要可变数据的函数。如果您确实不打算修改数组,请采用
常量字符*

void Cats::setName(const char* s)
或者,更妙的是,正如巴瑟谢巴所指出的,使用,它将为您管理内存

void Cats::setName(std::string s)

使用<代码> < <代码> >代码>删除>代码>,在现代C++中,一般是代码的气味,应该避免。我们有字符串<代码> STD::Stry<代码>:数组< < /> >和代码> STD::数组的向量< /代码>,和<代码> STD::UnQuyJPPT/<代码>和STD::SyrdYPPTR < /代码>,用于拥有的堆内存。而编译器将为您管理内存。

首先在setter中使用此语句

name = new char[strlen(s + 1)];
是不正确的。它应该看起来像

name = new char[strlen(s ) + 1];
然而,该功能至少应按以下方式定义

void Cats::setName( const char *s ) {
    if (this->name != nullptr) delete[] name;

    size_t n = strlen( s ) + 1;
    name = new char[n];
    strcpy_s(s, n, name);
}
您正在调用传递给它的字符串文本的函数

Cats::Cats() {
setName("NoName"); <----- problem here and in other constructors also.
setWeight(0.6);
setAge(0);
}
构造函数至少应该看起来像

Cats::Cats() : name( nullptr ) {
    setName("NoName");
    setWeight(0.6);
    setAge(0);
}

假设在类定义中,数据成员名称未使用nullptr显式初始化。

注意
strlen(s+1)
需要是
strlen(s)+1
。那太好了!所以我知道我应该避免在setter中直接使用
new
delete
。我只使用
std::string
,函数应该是
this->name=s
?正确的。一般来说,你应该避免使用
new
delete
。它们是低级别的高级技术,可以需要非常小心和注意以最小化错误。你有机会了解constness。保留你的new和delete,使函数采用const char指针。字符串建议很好,但它剥夺了你了解const corrections的机会。是的,我正试图解决它。无论如何,还是没有运气。也许有点其他事情不好。将继续尝试,谢谢:)“
“NoName”
是一个
const char*
”-从技术上讲,它是一个
const char[7]
,在某些上下文中,例如在函数参数中,它会衰减为
const char*
如果(this->name!=nullptr)delete[]name;
:如果条件是冗余的,。@prapin在这种情况下,也可以说delete调用是冗余的。
Cats::Cats() : name( nullptr ) {
    setName("NoName");
    setWeight(0.6);
    setAge(0);
}