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/<代码>和
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);
}