错误:' char *'的分配不兼容的类型to' char [20]'

时间:2015-11-19 12:48:59

标签: c++ constructor

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

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

当我编译它时,它给我一个错误,指出char*char[20]的分配不兼容。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:7)

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

因此,错误消息告诉您无法分配指向数组的指针。很公平。无论如何都不重要,因为语言不允许您将数组分配给数组。洛尔。

这就是为什么,自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是一个方便的原始数组包装器,可以被分配(并且不会对指针产生奇怪的衰减!)。

&#34;啊,但我的老师告诉我要使用原始阵列,&#34;我听你说。很遗憾,但我们也可以解决这个问题。要么通过引用接受数组,要么接受指向它的指针(正如你现在正在做的那样!但这会从类型中删除维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);
    }
};

答案 1 :(得分:0)

You can't assign to an array.

You can iterate over the array, and copy each item individually - eg. :

Student (char nm[20], long val) : 
     number(val) {
    for (size_t i = 0; i < 20; ++i) {
        name[i] = nm[i];
    }
}

Alternatively (as suggested in a comment by @LogicStuff), you can use std::string :

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

答案 2 :(得分:0)

通过值传递的数组作为函数的参数被隐式转换为指向其第一个元素的指针。

因此,例如,以下构造函数声明是等效的

Student (char nm[20], long val);
Student (char nm[100], long val);
Student (char nm[], long val);
Student (char *nm, long val);

数组既没有复制构造函数也没有复制赋值运算符。这意味着你可能不会这样写

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

你应该改变构造函数。

首先,最好用限定符const声明第一个参数。在这种情况下,您可以将构造函数传递给字符串文字

构造函数可以按以下方式查找

#include <cstring>

//...

Student ( const char nm[20], long val) : number(val) 
{
    std::strncpy( name, nm, 20 );
    name[19] = '\0';
}

在本声明中,我仅将nm[20]用于展示。

否则,您应该使用标准类std::string而不是字符数组。

答案 3 :(得分:-1)

在C ++中,您可以将数组视为指向其第一个数组元素的简单指针。也许这会让你更清楚为什么你不能将一个数组分配给另一个数组,因为你试图将一个数组赋给一个指向数组元素的指针。

您可以迭代遍历数组并按值复制值,也可以使用std::memcpystd::copy来完成工作,而不是这样做。我建议您使用std::copy