我是这个C++环境的新手,我的构造函数很难.这是我的代码:
class Student {
char name[20];
long number;
public:
Student (char nm[20], long val) :
name(nm), number(val) {}
Run Code Online (Sandbox Code Playgroud)
当我编译它,它给了我一个错误说中的分配不兼容的类型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) {}
};
Run Code Online (Sandbox Code Playgroud)
如果必须使用数组,则可以执行以下操作:
class Student {
std::array<char, 20> name;
long number;
public:
Student (std::array<char, 20> nm, long val) :
name(nm), number(val) {}
};
Run Code Online (Sandbox Code Playgroud)
因为std::array
,在2011年推出,是一个方便的原始数组包装器可以分配(并没有指针的奇怪衰减!).
"啊,但我的老师告诉我使用原始阵列,"我听到你说.很遗憾,但我们也可以解决这个问题.要么通过引用接受数组,要么接受指向它的指针(就像你现在正在做的那样!但这会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));
}
};
Run Code Online (Sandbox Code Playgroud)
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);
}
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5081 次 |
最近记录: |