当我尝试通过构造函数分配 char 数组时出现错误



我想将一个 char 数组传递给我的构造函数并初始化成员变量field,但我收到以下错误:

错误:将"char*"分配给"char [255]"时的类型不兼容

class C
{
char field[255];
public:
C(char field[255])
{
this->field=field;
}
};

你不能像在 c++ 中那样分配/复制数组。相反,您可以使用std::copy在构造函数中复制数组:

C(char f[255])
{
std::copy(f, f + 255, field);
}

我建议使用std::string而不是char[255]。那么你的类就变成了:

class C
{
std::string field;
public:
C(std::string field) : field(std::move(field)) {}
};

这样,您就不必担心数组是否足够大。

你不能用赋值运算符复制 C 数组,但C++提供了std::array

class C
{
std::array<char, 255> field;
public:
C(const std::array<char, 255> &field) : field(field) {}
};

如果您可以使用动态内存分配,并且字段的大小也可以是动态的,则应首选std::string

class C
{
std::string field;
public:
C(const std::string &field) : field(field) {}
};

在函数参数中,char[](指定或不指定数字(只是char*指针的语法糖。 而且您不能使用char*指针初始化char[]数组,因此会出现编译器错误。

对于您正在尝试的内容,您必须复制char*指向的内存,例如:

class C
{
char field[255];
public:
C(char field[255]) // aka C(char *field)
{
memcpy(this->field, field, 255);
// or: std::copy(field, field+255, this->field);
// or: std::copy_n(field, 255, this->field);
}
};

或者,如果要确保调用方只能传入char[255],请通过引用而不是指针传递它:

class C
{
char field[255];
public:
C(const char (&field)[255])
{
memcpy(this->field, field, 255);
// or: std::copy(field, field+255, this->field);
// or: std::copy_n(field, 255, this->field);
}
};

话虽如此,您应该考虑改用std::array,然后您可以根据需要使用operator=分配:

#include <array>
using Char255Array = std::array<char, 255>;
class C
{
Char255Array field;
public:
C(const Char255Array &field)
{
this->field = field;
}
};

或者更好的是,使用构造函数的成员初始化列表:

#include <array>
using Char255Array = std::array<char, 255>;
class C
{
Char255Array field;
public:
C(const Char255Array &field)
: field(field)
{
}
};

不建议在 c++ 中使用原始数组,您可以阅读有关向量和数组类的信息,它们更有用。尽管您的问题的解决方案是您只需要将属性字段的类型更改为 char*,但它可以完美运行。 有关更多说明: 在 C++ 中,您可以为 char* 类型分配一个 char 数组,但相反是不可能的,因为指针只指向第一个字符。

class C
{
char* field;
public:
C(char field[255])
{
this->field=field;
}
};

最新更新