我想将一个 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;
}
};