使用struct的数据赋值的类型不兼容(相同类型!)

时间:2014-05-08 19:35:34

标签: c++ c struct

我有一个结构:

struct record {
  char team[40];
}

我尝试将其属性复制到另一个stuct。

struct record rec2;
struct record rec;

rec.team = rec2.team;

除此之外,我在rec.team = rec2.team行上收到以下编译时错误:

error: incompatible types in assignment

如果我对值进行硬编码,就会出现同样的问题。

我的理解是,这是不可能的,但无论如何它显然正在发生。我很感激能够深入了解这里发生的事情。

3 个答案:

答案 0 :(得分:5)

阵列不可分配。

假设您真的使用C ++,一个明显的选择是使用std:::vectorstd::string,其中任何一个都是可分配的。

如果你不能这样做,你可以创建一个类作为数组的包装,然后在record中包含该类的实例。正如Jonathan Leffler提醒我们的那样,将数组包装在一个结构中使得它可以赋值,即使数组本身不是。

如果由于某种原因无法做到这一点,可以使用std::copy(在C ++中)或memcpy(在C中)复制数组的内容。至少在我看来,这绝对应该是你的最后选择,因为它将代码用户正确地将数据从一个字段复制到另一个字段的负担,而不是让代码使用户容易。 / p>

答案 1 :(得分:3)

数组没有复制赋值运算符。所以你应该将一个数组复制到另一个数组在您的情况下,您可以简单地为一个结构分配另一个结构,您只需编写

rec = rec2;

由于您似乎在使用C代码然后复制数组,您应该使用标题memcpy中声明的标准函数<string.h>

例如

memcpy( rec.team, rec2.team, 40 );

或者,如果数组包含字符串,则可以使用函数strcpystrncpy。例如

strcpy( rec.team, rec2.team );

如果您使用的是C ++,那么您也可以使用标准函数std::strcpystd::strncpy,因为数组是结构的公共数据成员。没有必要声明构造函数。 另一种方法是使用标准类std::array。例如

#include <array>

struct record{

std::array<char, 40> team;

};

record rec, rec2;
//.. some other code

rec = rec2;

答案 2 :(得分:0)

请注意,在声明一些type a[N]数组时:

  1. 您无法将a设置为其他值
  2. a的值等于a
  3. 的地址

    与其他类型的变量不同,数组具有 l-value

    因此,实质上,您可以将数组的名称视为常量标签。


    如果要将一个阵列的内容复制到另一个阵列,则可以使用任何标准的内存复制例程,也可以自行实现。

    示例#1:

    memcpy(rec.team,rec2.team,40*sizeof(char));
    

    示例#2:

    for (int i=0; i<40; i++)
        rec.team[i] = rec2.team[i];