gpt4 book ai didi

c++ - 错误 : incompatible types in assignment of 'char*' to 'char [20]'

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:31 25 4
gpt4 key购买 nike

我是这个 C++ 环境的新手,我在使用构造函数时遇到了困难。这是我的代码:

class Student {
char name[20];
long number;
public:
Student (char nm[20], long val) :
name(nm), number(val) {}

当我编译它时,它给我一个错误,指出将 char* 赋值给 char[20] 时类型不兼容。

我该如何解决这个问题??

最佳答案

您的构造函数参数nm 实际上不是数组!是的,我知道它看起来像一个,因为你写了 char nm[20]。但实际上,它是 char* nm。当您在函数参数列表中写入数组类型时,会自动执行该转换。是的,这很愚蠢。责怪 C。

因此,错误消息告诉您不能将指针分配给数组。很公平。无论如何都没有关系,因为语言不允许您将数组分配给数组。哈哈。

这就是为什么自 1998 年以来,我们一直使用 std::string 来解决所有这些可怕的问题:

class Student {
std::string name;
long number;
public:
Student (std::string nm, long val) :
name(nm), number(val) {}
};

如果您必须使用数组,您可以这样做:

class Student {
std::array<char, 20> name;
long number;
public:
Student (std::array<char, 20> nm, long val) :
name(nm), number(val) {}
};

因为 2011 年推出的 std::array 是一个方便的原始数组包装器,可以 赋值(并且指针没有那种奇怪的衰减! ).

“啊,但我的老师告诉我要使用原始数组,”我听到你说。很遗憾,但我们也可以解决这个问题。要么通过引用接受数组,要么接受一个指向它的指针(就像你现在做的那样!但这会从类型中删除维度 20 并使事情变得不安全 -.-)并做一个手册每个元素从源到目标的拷贝。当然不理想,但如果这是家庭作业,这可能是您的老师所期望的:

class Student {
char name[20];
long number;
public:
Student (char (&nm)[20], long val) :
number(val)
{
assert(sizeof(nm) == sizeof(name));
std::copy(std::begin(nm), std::end(nm), std::begin(name));
}
};

class Student {
char name[20];
long number;
public:
Student (char* nm, long val) :
number(val)
{
// just have to hope that the input is a pointer to **20** elements!
std::copy(nm, nm+20, name);
}
};

关于c++ - 错误 : incompatible types in assignment of 'char*' to 'char [20]' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33804462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com