c ++初始化类的char数组成员

Posted

技术标签:

【中文标题】c ++初始化类的char数组成员【英文标题】:c++ initializing char array member of class 【发布时间】:2018-11-09 14:32:13 【问题描述】:

在我的 c++ 项目中,我有两个成员的班级。我遇到问题的 char 数组成员。

class frame_message

public:
    explicit frame_message(const unsigned int id, const char data[]) :id_(id), data_ *data ;
    // only the first char 'a' is copied to `data_`
    char* get_data()  return data_; ;
    void get_data(char** data)  *data = data_; ;
private:
    unsigned int id_; char data_[8];
;

现在我想从 main 方法发送另一个用于初始化类数组的 char 数组。

main

char data[8]='a','b','c' // indexs 3 to 7 are '\0'
char data2[8];
char data3[8];
frame_message myMessage(0xF004,data); // the data is passed as "abc"
data2 = myMessage.get_data(); // analysis error
myMessage.get_data(&data3); // runtime exception

我应该如何使用发送给构造函数的数据数组来初始化类的私有成员?

对于get_data 函数也应该传递什么数据类型?

附言我是 c/c++ 新手,但对指针、引用尤其是 charchar* 感到困惑

【问题讨论】:

main 缺少参数列表和返回类型。似乎没有任何理由在这里使用固定大小的 C 样式数组。只需使用std::string,您就不会遇到任何问题。 你有两个方法叫做 get_data 看起来第二个应该叫做 set_data ? 请记住,在您的情况下 *data = 'a' 当您可能需要数组的副本时。有两种方法可以做到这一点,你可以只给它数据的地址 - 即在你的构造函数中丢失 * 或者如果你想也将数据保留在 main 中以供以后使用,则执行 memcpy 或类似的操作。如果你只是给它地址,那么在一个地方修改它也会修改另一个地方。编辑:我刚刚注意到你使用了静态数组,所以仅仅分配地址是行不通的——你需要复制 【参考方案1】:

对于构造函数,最好也传递一个长度参数,因为您最多只能接受 8 个字节。 那么,如果你的长度是

memcpy(data_, data, length)

在您的参数化 get_data 中也是如此,所以它会是:

memcpy(*data, data_, 8) /* Assuming that they provide long enough array. */

在处理数组时始终包含长度以及在处理指针时检查它们是否为 NULL 是一种很好的做法 - 我将把这个留给你。 您收到错误的原因是您无法将指针分配给静态声明的数组 - 它具有固定地址,您只能更改内容。

【讨论】:

以上是关于c ++初始化类的char数组成员的主要内容,如果未能解决你的问题,请参考以下文章

c语言结构体中的一个char数组怎么赋值?

如何使用代码初始化静态成员字符数组

c语言中怎样通过索引获取结构体成员的值

无法在类的析构函数中删除指向数组的成员指针

C/C++ 将 char 数组初始化为 const char*

C中结构体内有一个成员是二维数组,可以直接赋值另一个一维数组吗?