构造函数动态数组报错:无法将char*转换为char(因任务限制需用char*)
问题分析与修复
核心错误原因
报错=': cannot convert 'char*' to 'char'是因为构造函数里的类型不匹配:DynamicLines是char*类型的字符数组,DynamicLines[counter]代表数组里的单个字符;而otherline是char*类型的字符串指针。你试图把一个字符串指针直接赋值给单个字符,这在C++里是不允许的。
分场景修复方案
场景1:用DynamicLines存储单个字符串(长度限制为Size)
如果你的需求是把输入的字符串存入DynamicLines这个字符数组,需要修改构造函数,用字符串复制函数来处理,同时修正其他内存越界问题:
修改后的完整代码:
#include <iostream> #include <cstring> // 引入strncpy头文件 class Line { public: const int Size = 10; char* DynamicLines = new char[Size]; // 字符数组,存储单个字符串 int counter = 0; Line(char* otherline) { // 用strncpy复制字符串,最多复制Size-1个字符,留位置存结束符'\0' strncpy(DynamicLines, otherline, Size - 1); // 手动添加字符串结束符,避免乱码 DynamicLines[Size - 1] = '\0'; std::cout << "constructor called\n"; } ~Line() { delete[] DynamicLines; std::cout << "destructor called\n"; } void Print(); }; void Line::Print() { // 打印整个字符串,同时计算长度 std::cout << "字符串内容: " << DynamicLines << "\n"; int len = 0; while (DynamicLines[len] != '\0') { len++; } std::cout << "长度 = " << len << "\n"; } int main() // 标准main函数返回类型是int,不是void { // 分配足够空间存储输入的字符串,避免越界 char* temp = new char[100]; std::cin >> temp; Line Fline(temp); Fline.Print(); delete[] temp; // 对应new[],要用delete[]释放 system("pause"); return 0; }
场景2:用DynamicLines存储多个字符串(最多Size个)
如果你的需求是存储多个字符串(比如最多10个),需要把DynamicLines改为char**类型(指向字符串指针的数组),同时调整构造逻辑:
修改后的完整代码:
#include <iostream> #include <cstring> class Line { public: const int Size = 10; char** DynamicLines = new char*[Size]; // 存储多个字符串的指针数组 int counter = 0; Line(char* otherline) { if (counter < Size) { // 先分配空间存储输入的字符串,长度为字符串实际长度+1 int strLen = strlen(otherline); DynamicLines[counter] = new char[strLen + 1]; strcpy(DynamicLines[counter], otherline); counter++; } std::cout << "constructor called\n"; } ~Line() { // 先释放每个字符串的空间,再释放指针数组 for (int i = 0; i < counter; i++) { delete[] DynamicLines[i]; } delete[] DynamicLines; std::cout << "destructor called\n"; } void Print(); }; void Line::Print() { std::cout << "存储的字符串列表:\n"; for (int i = 0; i < counter; i++) { std::cout << "第" << i+1 << "个: " << DynamicLines[i] << "\n"; int len = strlen(DynamicLines[i]); std::cout << "长度 = " << len << "\n"; } } int main() { char* temp = new char[100]; std::cin >> temp; Line Fline(temp); Fline.Print(); delete[] temp; system("pause"); return 0; }
额外注意点
- 原代码中
void main()不符合C++标准,标准main函数返回类型是int,需要改为int main()并返回0。 - 用
new[]分配的内存,必须用delete[]释放,否则会造成内存泄漏(比如原main里的delete temp应该改为delete[] temp,因为temp是用new char[100]分配的)。 - 处理字符串时一定要注意添加
'\0'结束符,否则打印时会出现乱码。
内容的提问来源于stack exchange,提问作者righthere
相关产品推荐
相关产品推荐

