You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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赋值,直接返回这两个成员属于未定义行为。

报错解决方法

你可以选择两种对象创建方式:

  1. 栈上创建对象(不需要手动释放内存,更推荐新手使用):
Forma forma1("Cuadrado", "azul");
Rectangulo rectangulo("Rectangulo", "Negro", 5, 3);
  1. 堆上创建对象(需要用指针接收,使用完要手动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:06:04