C++新手遇Forma*转Forma报错 咨询imprimir函数实现方法
问题排查与解决
编译报错核心原因
- 类型不匹配:
new关键字在C++中返回的是对应类型的指针,比如new Forma(...)返回的是Forma*类型,你直接将指针赋值给栈上的Forma类型对象,没有对应的转换构造函数,自然会报错。 - 构造函数传参语法错误:C++调用构造函数传参不需要写参数名,你代码里的
nombre "Cuadrado"、color "azul"属于无效语法,直接传参数值即可。 - main函数位置错误:C++的程序入口
main是全局函数,不能定义在类内部,写在Programa_prueba类中的main不会被识别为程序入口。 - 调用不存在的无参构造:你自定义了
Rectangulo的有参构造函数后,编译器不会自动生成默认无参构造,代码中Rectangulo rectangulo1;调用无参构造会报错。 - 成员变量未初始化:
Area、Perimetro函数中仅计算输出了结果,没有给类成员area、perimetro赋值,直接返回这两个成员属于未定义行为。
报错解决方法
你可以选择两种对象创建方式:
- 栈上创建对象(不需要手动释放内存,更推荐新手使用):
Forma forma1("Cuadrado", "azul"); Rectangulo rectangulo("Rectangulo", "Negro", 5, 3);
- 堆上创建对象(需要用指针接收,使用完要手动
delete释放内存):
Forma* forma1 = new Forma("Cuadrado", "azul"); Rectangulo* rectangulo = new Rectangulo("Rectangulo", "Negro", 5, 3); // 使用完后释放内存 delete forma1; delete rectangulo;
Rectangulo类imprimir函数实现
你当前的imprimir函数有两个问题:一是返回值为string类型但返回了0,类型不匹配;二是拼接输出时混用了字符串拼接符+和流输出符<<,无法正确拼接数字。
正确实现如下:
// 加override显式标记重写父类虚函数,是C++的最佳实践 string imprimir() override { // 数字转字符串用std::to_string函数 string res = "Nombre: " + nombre + "\n" + "Color: " + color + "\n" + "Lado Mayor: " + to_string(ladoMayor) + "\n" + "Lado Menor: " + to_string(ladoMenor) + "\n"; cout << res; return res; }
其他优化建议
- 父类的虚函数建议加
virtual标记,子类重写时加override标记,避免重写错误。 Area、Perimetro函数建议计算完后给对应的成员变量赋值再返回,或者直接返回计算结果,不需要额外存成员变量的话可以删掉area、perimetro成员,避免未初始化问题。- 成员函数中如果不修改成员变量,建议加
const标记,比如string getNombre() const,提高代码安全性。
内容的提问来源于stack exchange,提问作者Jose Elias Trujillo Mendez
相关产品推荐
相关产品推荐

