C++类内char[100]数组成员赋值类型不兼容报错咨询
报错原因及修复方案
错误原因
报错核心原因是C++语法规则限制:Dto::message.text是固定长度的char[100]数组类型,数组名本身是常量指针,无法直接通过=运算符将char*类型的入参赋值给数组,只能拷贝指针指向的字符串内容到数组内存空间中。
修复方案
方案1:保留原有char数组结构的修改方式
该方案不需要改动头文件的结构体定义,只修改setText实现,额外引入<cstring>头文件使用字符串操作函数即可:
- 先在dto.cpp顶部引入头文件:
#include <cstring>
- 修改
setText函数实现:
void Dto::setText(char* text) { // 最多拷贝99个字符,预留1位存储字符串结束符'\0',避免内存溢出 strncpy(Dto::message.text, text, sizeof(Dto::message.text) - 1); // 手动补结束符,避免传入字符串长度超过99时出现字符串未终结的问题 Dto::message.text[sizeof(Dto::message.text) - 1] = '\0'; }
补充优化建议:可将
setText的入参类型改为const char*,同时同步修改头文件中的函数声明,符合const正确性规范,也支持传入常量字符串作为参数。
方案2:推荐的现代C++实现,改用std::string
该方案不需要手动管理字符串拷贝和内存边界,代码更简洁安全,改动如下:
- 修改dto.h代码:
#include <string> ... class Dto { public: struct msg { int id; byte type; std::string text; // 替换原有的char text[100]定义 }; std::string getText(); void setText(const std::string& text); private: Dto::msg message; ...
- 修改dto.cpp代码:
std::string Dto::getText() { return Dto::message.text; } void Dto::setText(const std::string& text) { Dto::message.text = text; // std::string已重载赋值运算符,可直接赋值 }
内容的提问来源于stack exchange,提问作者sschueller
相关产品推荐
相关产品推荐

