错误:将'char*'赋值给'char [20]'时出现不兼容的类型

Ana*_*mus 2 c++ constructor

我是这个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].

我怎样才能解决这个问题??

Lig*_*ica 7

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)